来自Effective Java:
通用方法的一个值得注意的特性是您无需指定 调用时类型参数的值必须与调用时一样 通用构造函数。编译器计算出类型的值 参数通过检查方法参数的类型。
那么在没有参数的方法的情况下编译器如何推断类型?
例如,考虑以下静态工厂方法,每次调用它时都会创建一个新的HashMap:
// Generic static factory method
public static <K,V> HashMap<K,V> newHashMap() {
return new HashMap<K,V>();
}
当调用方法时:
Map<String,String> pair = newHashMap(); //it returns a Map<String,String>
当它打电话时
Map<String, List<String>> anagrams =newHashMap(); // it returns a Map<String,List<String>
答案 0 :(得分:4)
它根据返回分配的变量类型推断出它。
public class GenericTest {
public static void main(final String[] args) {
final GenericTest test = new GenericTest();
String data = test.echo();
}
public <T> T echo() {
return null;
}
}
在上面的代码示例中,编译器根据data
字段的类型推断通用参数类型,在本例中为String
。
答案 1 :(得分:0)
编译器只有有限数量的变量可用于推断类型。如果方法不带参数,那么该方法只能是一个简单的覆盖,因为返回值不能用于键入方法,而是留下方法本身的名称。编译器必须选择继承链的距离,以选择哪个父/子类具有实际调用的方法。