【发布时间】:2016-04-22 21:21:14
【问题描述】:
我有一个这样的方法(称为 foo):public void foo (String parm) 我知道有时需要一个整数,我会将其转换为字符串(不仅仅是“”+ x,它比这更复杂,您不能仅通过查看 int 值来确定字符串值。int 值将是用作索引。
所以现在我这样做:
public void foo(Object obj) {
if (obj instanceof String) {
...
} else if (obj instanceof Integer) {
...
} else // some sort of error
}
如果您执行以下操作,则不会在编译时捕获错误:
foo(new Date());
有没有办法在编译时捕获它(除了创建两个单独的方法 public void foo(Integer x) 和 public void foo (String str)?
【问题讨论】:
-
重载你的方法。一个接受字符串,另一个接受整数。
-
“除了制作两个单独的方法”这样做有什么问题?重载正是您在编译时处理类型不一致的方式。你到底希望什么?一般来说,如果你有一个方法可以接受不同类型的输入并用它们做不同的事情,这是一个不好的迹象。而是定义两个单独的方法。
-
虽然您可以在 C++ 中实现这一点(恕我直言,这种方式使这个问题合法化),但您不能在 Java 中做到这一点。任何解决方案都可以归结为恰好有两个重载函数。
-
这是一个简化但基本上是 public void foo (Object obj) { int ind = 0;字符串 str = null; if (obj indexof Integer) { ind = (Integer) obj; str = someList.get(ind); } else if (obj instanceof String) { str = (String) obj;我有 7 或 8 个这样我可以将它们加倍,也许这是最好的解决方案,但还有很多事情要做。
-
重载方法是告诉编译器哪些参数类型是可接受的。