在重构遗留代码并开始使用泛型之后,我发现函数看起来像这样:
T[] splitXXX() {
//blah blah
}
产生大量的类转换异常,因为 jdk 并不真正支持泛型类型的数组。我想知道 - 为什么这段代码可以在 java 中干净地编译?它与向后兼容性有关吗?(如果我能在编译时而不是在运行时发现这个错误,它会为我节省很多调查时间)。我错过了什么?
如果类型变量只出现在返回类型中,那是非常危险的。例如
public static <T> T foo(){ ... }
// usage
String s = foo();
Integer i = foo();
编译器认为,如果程序员分配T
给String
,他可能知道他在做什么,所以推断 是很安全的T=String
。哎呀,真的没有任何限制,foo()
可以将结果分配给任何类型。
但是程序员可能并不总是知道他在做什么。他依靠强类型编译器来捕捉一些他可能无意中犯的打字错误。
仅仅因为你不能做new T[...]
并不意味着你不能有一个带有类型的变量T[]
,就像仅仅因为你不能做new T()
并不意味着你不能有一个带有类型的变量T
。
完全有可能拥有具有返回方法的正确代码T[]
:
class Something<T> {
T[] foo;
Something(T[] in) { foo = in; }
T[] splitXXX() { return foo; }
}
产生大量的类演员表,
好吧,如果它产生异常,这意味着你做错了什么。您没有向我们展示什么代码正在产生异常或任何东西,但您可能正在执行代码中无效的强制转换。