如何在运行时检查'instanceof'以及Java对象的Generic类型?

时间:2016-04-28 17:23:26

标签: java instance

如何检查使用泛型的Java对象的instanceofisAssignableFrom

如果我有这种方法只检查instanceof,但我也想检查它是否返回Boolean类型而不是另一种类型,我该怎么做?

public void myMethod(ObjectA<Boolean> object)
{
    if ( object instanceof ObjectA ) {
       // then do something
    }
}

1 个答案:

答案 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持有对SocketNoSuchElementException对象的引用。

以上所有例外都是具有原始类型的表达式。不要使用原始类型。这就是原因:

对于原始类型,客户端可能会写

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或多或少会与您可能抛出的内容相同。

我不会专门检查这种原始用法。