1

从有效的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>
4

2 回答 2

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.

于 2013-02-25T15:15:58.337 回答
0

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

于 2013-02-25T15:20:54.343 回答