编译器如何推断无参数方法的类型?

时间:2013-02-25 15:11:59

标签: java generics

来自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>

2 个答案:

答案 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)

编译器只有有限数量的变量可用于推断类型。如果方法不带参数,那么该方法只能是一个简单的覆盖,因为返回值不能用于键入方法,而是留下方法本身的名称。编译器必须选择继承链的距离,以选择哪个父/子类具有实际调用的方法。