代码之家  ›  专栏  ›  技术社区  ›  kmort

为什么我必须强制转换这个泛型类型?

  •  0
  • kmort  · 技术社区  · 6 年前

    我试图创建一个可比较的节点,并且只保存可比较的对象。

    根据我对Java的理解,成员变量 value E ,所以稍后当我在 compareTo() ,它应该仍然是类型 电子 ,应该不需要强制转换,但编译器告诉我这不是以下情况:

    incompatible types: java.lang.Comparable cannot be converted to E .

    我想应该已经是那种类型了 . 我为什么要投 o.value 键入

    代码如下。

    public class fakenode<E extends Comparable<E>> implements Comparable<fakenode> {
     public E value;
    
     fakenode (E value)
     {
        this.value = value;
     }
    
     @Override
     public int compareTo(fakenode o) {
        value.compareTo((E)o.value); // Why must I cast o to type E here?
        o.value.compareTo(value);    // This one works just fine
    
        return -1;
     }
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   Eran    6 年前

    您遗漏了泛型类型参数 E fakenode .

    应该是:

    class fakenode<E extends Comparable<E>> implements Comparable<fakenode<E>> { // first change
        public E value;
    
        fakenode (E value)
        {
            this.value = value;
        }
    
        @Override
        public int compareTo(fakenode<E> o) { // second change
            value.compareTo(o.value);
            o.value.compareTo(value);
    
            return -1;
        }
    }
    

    我想这不是你的真实逻辑 compareTo 方法,因为它总是返回 -1 .