9

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

在此类Foo<T>中,strings成员与以下内容没有任何关系T

package test;
import java.util.ArrayList;

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

    T getSome() {
        return null;
    }
}

该类主要用于:

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
    }
}

编译错误是“不兼容的类型。必需:找到的字符串:对象”。

当使用原始类型时,Java 似乎忘记了String类型参数。ArrayListFoo

我的 java 版本是 1.7.0_21

4

1 回答 1

11

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

这在JLS §4.8中有概述:

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

  • 通过采用泛型类型声明的名称而不附带类型参数列表形成的引用类型。

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

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

注意最后一个项目符号。

于 2013-10-08T13:34:12.077 回答