如果我有课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)