2015-10-28 68 views
6

我已经定义了下面的泛型类,但是当我在类对象上使用它时,它不能编译。构造函数不会接受其他对象Diamond不编译Java 7

class Pair<T,V> { 

    T one; 
    V two; 


    public Pair(T one, V two) { 
     this.one = one; 
     this.two = two; 
    } 


} 
public static void main(String[] args) { 

    String hamza = "Hamza"; 
    Integer soufiane = 0; 

    Pair<Object,Object> pairOne = new Pair<>(hamza, soufiane); 
    Pair<Object,Object> pairTwo = new Pair<Object, Object>(soufiane, hamza); 

} 

错误消息:

incompatible types: Pair<String,Integer> cannot be converted to Pair<Object,Object> 

为什么第一个未编译和第二编译?

编辑:它编译于Java 8

+0

某些东西不编译并且编译器不会告诉你_why_它不能编译是非常罕见的。 – Tom

+1

我在那里包含错误消息!这是菱形符号,它应该编译,至少据我所知。为什么它迫使我包含模板参数是我不明白的。 –

+3

好吧,泛型类型不是多态,因此将'Pair '赋值给'Pair '不起作用,Java 7认为它应该是'Pair ',因为你说通过的参数会告诉类型。另一方面,Java 8“找到”正确的泛型类型会更好一些。 – Tom

回答

3

您的代码失败,因为Java编译器7无法找到合适的推断类型;另一方面,Java 8将编译和工作正常。 (TL; DR:Java 7的不正确地与所有的钻石的作品,这是在Java改进8)

JEP 101: Generalized Target-Type Inference

平顺地膨胀方法类型推测的范围,以支持(ⅰ) 推理在方法上下文中和(ii)链接调用中的推理。

含义java 8将能够使用钻石算子确定您的呼叫类型。

编辑:看起来像有人殴打我在thread这个反应,并解释它比我更清楚;所以看看!