不要讨厌,但你必须告诉编译器你想做什么,因为替代方案是让它猜测你想要做什么。当然,你可能会想,“如果我正在检查一个对象的类型,显然这一定意味着我想将它转换为那个类型。” 但谁说?也许这就是你要做的,也许不是。
当然,在一个简单的情况下
if (x instanceof Integer)
{
Integer ix=(Integer) x;
...
我的意图很明显。或者是吗?也许我真正想要的是:
if (x instanceof Integer || x instanceof Double)
{
Number n=(Number) x;
... work with n ...
或者如果我写:
if (x instanceof Integer || x instanceof String)
你希望编译器接下来做什么?它应该为 x 假设什么类型?
重新评论 instanceof 已过时或其他坏主意的评论:它肯定会被误用。我最近在一个程序中工作,其中原作者创建了六个类,这些类都是页面和页面长,但彼此相同,拥有它们的唯一明显原因是他可以说“x instanceof classA”而不是“ x instanceof classB"等。也就是说,他将类用作类型标志。最好只有一个类并为各种类型添加一个枚举。但也有很多非常好的用途。也许最明显的是:
public MyClass
{
int foo;
String bar;
public boolean equals(Object othat)
{
if (!(othat instanceof MyClass))
return false;
MyClass that=(MyClass) othat;
return this.foo==that.foo && this.bar.equals(that.bar);
}
... etc ...
}
如果不使用 instanceof,你将如何做到这一点?您可以使参数的类型为 MyClass 而不是 Object。但是,甚至无法使用通用对象来调用它,这在许多情况下可能是非常可取的。实际上,也许我希望一个集合同时包含字符串和整数,并且我希望不同类型的比较简单地返回 false。