gpt4 book ai didi

Java - instanceof 与运行时泛型类的转换 :

转载 作者:行者123 更新时间:2023-12-01 06:04:23 24 4
gpt4 key购买 nike

在 Herbert Schildt 从 Java Complete Reference 中提取的代码中:

class Gen<T> {
T obj;

Gen(T o) {
ob = o;
}

T getob() {
return ob;
}
}

class Gen2<T> extends Gen<T> {
Gen2(T o) {
super(o);
}
}

class Test {
public static void main(String args[]) {
Gen2<Integer> obj = new Gen2<Integer>(99);
}
}

他提到,instanceof 无法在运行时验证对象是否来自类型化泛型类,因为没有可用的泛型信息:

if (obj instanceof Gen2<Integer>) // illegal, doesn't compile

您只能使用

if (obj instanceof Gen2<?>) // legal

但是,只要兼容,您仍然可以将相同的对象转换到 (Gen):

(Gen<Integer>) obj // legal

但是:

(Gen<Long>) obj // illegal

这不是Java矛盾吗?如果 Java 知道 obj 可以在运行时转换为 Gen,为什么它不知道 obj 是 Gen 类/子类的实例?

最佳答案

我读了这本书,也对此感到困惑,我发现这个,也许有帮助:https://docs.oracle.com/javase/tutorial/java/generics/restrictions.html#cannotCast

However, in some cases the compiler knows that a type parameter is always valid and allows the cast. For example:

List<String> list1 = ...;
ArrayList<String> list2 = (ArrayList<String>)list1; // OK

关于Java - instanceof 与运行时泛型类的转换 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47834555/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com