检查对象是否在Java中强制转换为其动态类型

时间:2017-03-10 03:46:11

标签: java casting

我想知道是否有办法检查引用是否已转换为其对象的确切类型。例如......

String s = new String("test");
checkCast(s); //Returns true, since s has a dynamic and static type of String.
Object o = (Object) s;
checkCast(o); //Returns false, since the dynamic and static type of o are not equal.

关于实际问题的一些背景......

我有类A,B和C的层次结构,如下所示:

class A {}
class B extends A {}
class C extends B {}

然后我有一个LinkedList<A>个A对象。此列表可能包含上述任何类。然后我有一个像这样的方法......

<T extends A> T getFirstObjInList(){
   //Iterate over the list and return the first object that is of type T...
}

我需要知道如何检查列表中的对象是否是传递给方法的Generic Type。我不能使用instanceof因为擦除等而且我真的更喜欢不要改变方法的标题,即添加任何参数或类似的东西。

我首先尝试做的是在for循环中将列表中的每个对象转换为T,如果抛出ClassCastException,继续迭代,但这显然不适用于我拥有的层次结构,所以现在我是寻找一种方法来检查一个对象是否已被转换为其动态类型。 如果列表中的对象是指定的类型,那么在转换时,其静态类型不会改变,所以如果我可以比较这两种类型,我可以判断该对象是否是一个实例给定的通用类型。

注意:由于类型擦除,list.getFirst() instanceof T无法编译。

1 个答案:

答案 0 :(得分:3)

正如您现在可能已经得出的结论,由于类型擦除,您的方法签名不可行。我建议传递一个显式类型:

<T extends A> T getFirstObjInList(Class<T> type) {
    for (A a : list) {
        if (a.getClass() == type) {
            return type.cast(a);
        }
    }
    return null;
}