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

Nik*_*las 9 java generics

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

在本课程中Foo<T>,该strings成员与T以下内容无关:

package test;
import java.util.ArrayList;

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

    T getSome() {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

该类用于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
    }
}
Run Code Online (Sandbox Code Playgroud)

编译错误是"不兼容的类型.必需:String found:Object".

似乎Java 在使用raw类型时忘记了Stringtype参数.ArrayListFoo

我的java版本是1.7.0_21

ars*_*jii 11

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

这在JLS§4.8中概述:

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

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

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

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

注意最后一颗子弹.