【发布时间】:2016-08-04 19:02:13
【问题描述】:
为什么只有在 Main.main() 中取消注释第三条语句时才会得到 ClassCastException ?没有例外,但执行得很好的第一条和第二条语句?
public class Tuple<K, V> {
public final K first;
public final V second;
public Tuple(K first, V second) {
this.first = first;
this.second = second;
}
@Override public String toString() {
return "Tuple{" + "first = " + first + ", second = " + second + '}';
}
}
class Test { static Tuple f(){return new Tuple("test", 8);} }
class Bar {}
class Main{
public static void main(String[] args) {
Tuple<String, Bar> t = Test.f();
System.out.println(t);
//System.out.println(t.second.getClass().getSimpleName());
}
}
提前致谢。
【问题讨论】:
-
我的理解是这在 Java 中不起作用。您的泛型没有被赋予类型,它们是泛型。如果你有类似
public final K<String> first;的东西,这会起作用,它会返回字符串。 -
Test.f()返回原始类型。如果你避免使用原始类型,这个错误会更容易被发现。Test.f()的返回类型应定义为Tuple<String, Integer>以匹配返回的值。这将在Tuple<String, Bar> t = Test.f()上导致编译错误。类型安全是一项强大的功能。 -
你应该发布完整的错误:
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to Bar- 现在它变得更加清晰......
标签: java generics compilation jvm rtti