原始类型成员丢失的通用类型

时间:2013-10-08 13:10:19

标签: java generics

我在使用泛型时发现了一种奇怪的行为。

在此课程Foo<T>中,strings成员与T没有任何关系:

package test;
import java.util.ArrayList;

public class Foo<T> {
    ArrayList<String> strings;

    T getSome() {
        return null;
    }
}

该类用于main:

package test;

public class Main {

    public static void main() {
        Foo<Integer> intFoo = new Foo<>();
        Integer i = intFoo.getSome();
        String s1 = intFoo.strings.get(0);

        Foo rawFoo = new Foo();
        Object o = rawFoo.getSome();
        String s2 = rawFoo.strings.get(0); // Compilation error on this line
    }
}

编译错误是&#34;不兼容的类型。 required:找到的字符串:Object&#34;。

当使用String的原始类型时,Java似乎忘记了ArrayList类型参数{/ 1}}。

我的java版本是1.7.0_21

1 个答案:

答案 0 :(得分:11)

简单地说,因为rawFoo是原始的,它的非静态成员也变得原始。

JLS §4.8中列出了这一点:

  

更准确地说,原始类型被定义为以下之一:

     
      
  • 通过获取泛型类型声明的名称而不带伴随类型参数列表而形成的引用类型。

  •   
  • 元素类型为原始类型的数组类型。

  •   
  • 原始类型R的非静态成员类型,它不是从R的超类或超级接口继承的。

  •   

请注意最后一颗子弹。