奇怪的泛型问题

Ami*_*adi 5 java compiler-construction generics

有谁知道为什么以下代码不编译和编译期间我得到不兼容的类型异常?

public class Test<T> {

public static void main(String[] args)
{
    // using Test<?> solves the compilation error
    Test test = new Test();

    // getting error incompatible types:
    // found   : java.lang.Object
    // required: java.lang.Integer
    Integer number = test.getDays().get(0);
}


private List<Integer> getDays() {
    return new ArrayList<Integer>();
}
Run Code Online (Sandbox Code Playgroud)

}

为什么使用带有无界通配符的Test解决了这个问题?我正在使用java版本1.6.0_12

mik*_*kej 8

我解释的问题是,当返回类型不依赖于类型参数时,为什么不test.getDays()返回?List<Integer>T

当您创建一个变量,该变量是Test对编译器实例的原始引用时,会删除所有泛型以通过该变量进行访问(为了向后兼容).

因为test没有<T>指定它的类型,这也意味着丢弃了<Integer>for getDays.


Ade*_*zah 1

尝试这个:

public class Test<T> {

public static void main(String[] args)
{
    // using Test<?> solves the compilation error
    Test<Integer> test = new Test<Integer>();

    // getting error incompatible types:
    // found   : java.lang.Object
    // required: java.lang.Integer
    Integer number = test.getDays().get(0);
}


private List<Integer> getDays() {
    return new ArrayList<Integer>();
}

} 
Run Code Online (Sandbox Code Playgroud)