4

在重构遗留代码并开始使用泛型之后,我发现函数看起来像这样:

T[] splitXXX() {
   //blah blah
}

产生大量的类转换异常,因为 jdk 并不真正支持泛型类型的数组。我想知道 - 为什么这段代码可以在 java 中干净地编译?它与向后兼容性有关吗?(如果我能在编译时而不是在运行时发现这个错误,它会为我节省很多调查时间)。我错过了什么?

4

2 回答 2

0

如果类型变量只出现在返回类型中,那是非常危险的。例如

public static <T> T foo(){ ... }

// usage
String s = foo();
Integer i = foo();

编译器认为,如果程序员分配TString,他可能知道他在做什么,所以推断 是很安全的T=String。哎呀,真的没有任何限制,foo()可以将结果分配给任何类型。

但是程序员可能并不总是知道他在做什么。他依靠强类型编译器来捕捉一些他可能无意中犯的打字错误。

于 2012-12-04T18:49:32.393 回答
0

仅仅因为你不能做new T[...]并不意味着你不能有一个带有类型的变量T[],就像仅仅因为你不能做new T()并不意味着你不能有一个带有类型的变量T

完全有可能拥有具有返回方法的正确代码T[]

class Something<T> {
    T[] foo;
    Something(T[] in) { foo = in; }
    T[] splitXXX() { return foo; }
}

产生大量的类演员表,

好吧,如果它产生异常,这意味着你做错了什么。您没有向我们展示什么代码正在产生异常或任何东西,但您可能正在执行代码中无效的强制转换。

于 2012-12-05T03:51:02.890 回答