构造函数中的泛型推理

Jef*_*rey 13 java generics

如果我有课Foo:

public class Foo<T> {
    public Foo(T t) {
        //do something
    }

    public static <E> void bar(E e) {
         //do something
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么Foo.bar("String");推断它E是一个String(因此不会抛出编译器警告),但new Foo("String");不推断它T是一个String?

Boh*_*ian 10

因为构造函数可以被认为是一个特殊的实例方法,所以它不是类型化的 - 它从类名(带有类型参数)获取它的类型,例如Foo<String>.即构造函数未定义为:

public <T> Foo(T t) ...
Run Code Online (Sandbox Code Playgroud)

也不是.这样做会隐藏类的泛型类型(并且会收到警告)

然而,静态方法键入的.FYI,一般推断类型的泛型参数,相当于:

Foo.<String>bar("String");
Run Code Online (Sandbox Code Playgroud)