有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

从我对Java的理解来看,成员变量value应该是E类型,所以稍后当我在compareTo()中访问它时,它仍然应该是E类型,不需要强制转换,但编译器告诉我,这与以下情况不同:

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

我想它应该已经是E型了。为什么我必须在第一种用法中强制o.value键入E,而不是在第二种用法中?我错过了什么

代码如下

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) 个答案

  1. # 1 楼答案

    您在使用类型fakenode的两个地方漏掉了泛型类型参数E

    应该是:

    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