2013-02-25 66 views
1

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

一个通用的方法,显着的特点是,你不需要,你必须调用 通用CON组structors时指定 类型参数的值明确。编译器通过检查方法参数的类型来计算出类型 参数的值。

那么编译器在没有参数的情况下如何推断类型?

例如,考虑创建一个新的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

它也可以通过调用网站的期望来推断返回类型,但是只在有限的情况下:'String s = genericMethod();'其中'genericMethod(){...}'。 – 2013-02-25 15:15:03

+0

@Geek,你有没有想过的例子? – 2013-02-25 15:23:01

+0

@ KellyS.French请参阅已编辑的问题示例 – Geek 2013-02-25 16:04:32

回答

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

+0

你打算说编译器的类型推断依赖于程序员编写的返回类型吗?那么类型安全在哪里? – Geek 2013-02-25 16:17:39

+0

在讨论方法级别泛型时,类型安全性被限制在泛型方法体的范围,返回类型以及对返回类型的后续操作。 – Perception 2013-02-25 16:20:56

+1

@Geek:你是什么意思类型安全?你的方法在T上是通用的,所以对于任何T来说它是类型安全的。 – newacct 2013-02-25 18:28:53

0

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

相关问题