如何检查使用泛型的Java对象的instanceof
和isAssignableFrom
?
如果我有这种方法只检查instanceof
,但我也想检查它是否返回Boolean
类型而不是另一种类型,我该怎么做?
public void myMethod(ObjectA<Boolean> object)
{
if ( object instanceof ObjectA ) {
// then do something
}
}
答案 0 :(得分:0)
在您的示例中,instanceof
是不必要的(除非您想要检查null
,在这种情况下,您应该只使用null
检查==
。 / p>
您的方法声明
public void myMethod(ObjectA<Boolean> object)
已经强制要求调用者只能传递ObjectA<Boolean>
类型或可分配给ObjectA<Boolean>
类型的值。
换句话说,我不能写像
这样的代码ObjectA<Integer> notBoolean = ...;
myMethod(notBoolean);
编译器会拒绝它。
在您的方法中,由于参数的类型为ObjectA<Boolean>
,因此编译器保证在运行时没有任何内容可以通过ObjectA
。例如,您最终不会object
持有对Socket
或NoSuchElementException
对象的引用。
以上所有例外都是具有原始类型的表达式。不要使用原始类型。这就是原因:
对于原始类型,客户端可能会写
ObjectA<Integer> notBoolean = ...
ObjectA raw = notBoolean;
myMethod(raw);
并且编译器将放弃泛型类型检查并允许调用(编译器在该调用的上下文中删除泛型用法)。
在尝试类似
之类的操作时,您的代码可能会在运行时因ClassCastException
而失败
public void myMethod(ObjectA<Boolean> object)
{
Boolean ref = object.get(); // ClassCastException
// returns an `Integer` and attempts to assign it to a `Boolean` variable
}
您的object
仍会保留对ObjectA
个实例的引用,但无论它可能包含什么,都不一定是Boolean
(我假设ObjectA
这是Boolean
值的某种包装器。)
此ClassCastException
或多或少会与您可能抛出的内容相同。
我不会专门检查这种原始用法。