为什么编译?键入擦除

时间:2016-11-23 09:51:01

标签: java generics

为什么以下编译?我收到警告告诉我

  

getTest()返回一个原始类型,因此getTestIntegers()被删除

但我不明白为什么,List<String> tester = Test.getTest().getTestIntegers()不是通用的。我原以为public class Scratchpad { public static void main(String[] args) { new Scratchpad().run(); } private void run() { List<String> tester = Test.getTest().getTestIntegers(); } private static class Test<T> { public static Test getTest() { return new Test(); } public List<Integer> getTestIntegers() { return Collections.singletonList(1); } } } 会产生编译错误

{{1}}

1 个答案:

答案 0 :(得分:2)

正如已经指出的那样,getTest返回原始类型。该方法的正确实现如下所示:

public static <T> Test<T> getTest() {
    return new Test<>();
} 

请注意,您需要为静态方法指定一个通用参数 - 它可以是任何内容,因为与类签名中的T相同(但它通常很常见)使用相同的名称,如果它在同一个地方使用。)

那么这取决于编译器是否可以推断出正确的类型,有时可能需要你的&#34; help&#34;,例如。

List<String> tester = Test.<String>getTest().getTestIntegers();

(如果那里有必要,我没有尝试过,但这看起来如何)