2013-04-08 74 views
-1

这对我来说很奇怪。有人可以解释吗?这里有什么不对

请注意,代码从不使用“?extends”,只有“?super E”,但由于某些特殊原因,编译器 提出了“?extends”。

import java.util.Comparator; 

public class TestClass <E> { 

    private Comparator<? super E> compNatural = new Comparator<E>() { 
     @SuppressWarnings("unchecked") 
     @Override 
     public int compare(E lhs, E rhs) { 
      return ((Comparable<E>)lhs).compareTo(rhs); 
     } 
    }; 

    private Comparator<? super E> comp; 

    public TestClass(Comparator<? super E> comp) { 
     // Reports an error: 
     // Type mismatch: cannot convert from Comparator<capture#10-of ? extends Object> to Comparator<? super E> 
     this.comp = (comp==null) ? compNatural : comp; 

     // The following compiles OK!!! 
     if (comp==null) this.comp = compNatural; else this.comp = comp;   
    } 


} 
+0

这不是重复。看到下面的注释 – cyanide 2013-04-08 07:19:18

+0

这个问题一般发生在泛型中,所以只需使用编译的第二个选项(可能工作) – 2013-04-08 12:01:11

回答

1

这与三元运算符无法推断出正确的类型有关。请检查这个问题Java if ternary operator and Collections.emptyList()

+0

这应该是一个使用链接作为重复的评论。 – 2013-04-08 05:45:29

+0

我意识到这一点,但它看起来像这种情况是不同的。该线程列表 vs列表。这里我们有完全一样的类型:比较器。请纠正我,如果我错了。 – cyanide 2013-04-08 07:15:47