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

Java 编译器如何推断无参数方法的类型?,java,generics,Java,Generics,来自有效Java: 泛型方法的一个值得注意的特性是不需要指定 调用时必须显式指定类型参数的值 一般结构。编译器计算出类型的值 通过检查方法参数的类型来设置参数 那么,对于不带参数的方法,编译器如何推断类型呢 例如,考虑下面的静态工厂方法,每次调用它时创建一个新的HSMAP: // Generic static factory method public static <K,V> HashMap<K,V> newHashMap() { return new HashMap&

来自有效Java:

泛型方法的一个值得注意的特性是不需要指定 调用时必须显式指定类型参数的值 一般结构。编译器计算出类型的值 通过检查方法参数的类型来设置参数

那么,对于不带参数的方法,编译器如何推断类型呢

例如,考虑下面的静态工厂方法,每次调用它时创建一个新的HSMAP:

// 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>

它根据返回值也被分配的变量类型来推断

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;
    }
}

在上面的代码示例中,编译器根据数据字段的类型(在本例中为字符串)推断通用参数类型。

它也根据分配返回的变量类型推断通用参数类型

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;
    }
}


在上面的代码示例中,编译器根据数据字段的类型(在本例中为字符串)推断通用参数类型。

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

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

它还可以根据调用站点的期望推断返回类型,但仅限于有限的情况:String s=genericMethod;where T genericMethod{…}.@Geek,你有没有想到一个例子?@KellyS.French请看编辑后的问题以获得答案example@MarkoTopolnik你能详细解释一下你的评论吗..那些具体的情况是什么?我刚刚命名了一个具体的情况:将返回值赋给一个变量。它在方法参数的位置不起作用。它可能在返回genericMethod中工作;它还可以根据调用站点的期望推断返回类型,但仅限于有限的情况:String s=genericMethod;where T genericMethod{…}.@Geek,你有没有想到一个例子?@KellyS.French请看编辑后的问题以获得答案example@MarkoTopolnik你能详细解释一下你的评论吗..那些具体的情况是什么?我刚刚命名了一个具体的情况:将返回值赋给一个变量。它在方法参数的位置不起作用。它可能在返回genericMethod中工作;你的意思是说编译器的类型推断依赖于程序员编写的返回类型?那么类型安全性在哪里呢?在讨论方法级泛型时,类型安全性被限制在泛型方法体的范围、返回的类型以及对返回的类型的后续操作中。@Geek:什么是类型安全性?您的方法在T上是泛型的,因此它对任何T都是类型安全的。@Perception因此,如果我们有多个对echo的调用,每个调用都有不同的返回类型,比如一个调用string,另一个调用Integer?您的意思是说编译器的类型推断依赖于程序员编码的返回类型?那么类型安全性在哪里呢?在讨论方法级泛型时,类型安全性被限制在泛型方法体的范围、返回的类型以及对返回的类型的后续操作中。@Geek:什么是类型安全性?您的方法在T上是泛型的,因此对于任何T都是类型安全的。@Perception所以如果我们有多个对echo的调用,每个调用都有不同的返回类型,比如一个使用string,另一个使用Integer?