Eclipse告诉我Long不是可比较的

Sus*_*ded 1 java generics types parametric-polymorphism

我在这里处于一种奇怪的情况,即eclipse告诉我Long是"不是有界参数的有效替代品<T extends Comparable<? super T>>".关于可能是什么原因的任何建议?我在下面粘贴相关代码

抽象对:

public abstract class Pair<T extends Comparable<? super T>, R> implements Comparable<Pair<T, R>>{

    private T tt;
    private R rr;

    public Pair(T t, R r){
        tt = t;
        rr = r;
    }

    @Override
    public String toString(){
        return tt+ ": " +rr.toString();
    }
}
Run Code Online (Sandbox Code Playgroud)



具体对:

import utilities.Pair;

public class LogBookRecord<Long, String> extends Pair<Long, String>{

    LogBookRecord(Comparable t, Object r) {
        super(t, r);
        // TODO Auto-generated constructor stub
    }
}
Run Code Online (Sandbox Code Playgroud)


我尝试将抽象类标题更改为:

public abstract class Pair<T extends Comparable<T>, R> implements Comparable<Pair<T, R>>
Run Code Online (Sandbox Code Playgroud)

这没有帮助,也是:

public abstract class Pair<T, R> implements Comparable<Pair<T, R>>
Run Code Online (Sandbox Code Playgroud)

但是,在具体的类中,我得到一个通知,表明我应该将类型参数更改为<Comparable, Object>.

Sot*_*lis 7

public class LogBookRecord<Long, String> extends Pair<Long, String>{
                                ^                           ^
                                |                           |
      generic type variable declaration (new type names)    |
                                                  generic type arguments
Run Code Online (Sandbox Code Playgroud)

该代码相当于

public class LogBookRecord<T, R> extends Pair<T, R>{
Run Code Online (Sandbox Code Playgroud)

您只需将名称LongString您自己的类型变量名称隐藏起来.

由于T没有边界,因此不一定Comparable,编译器也无法将它们作为类型参数进行验证Pair.

你想要的是什么

public class LogBookRecord extends Pair<Long, String>{
Run Code Online (Sandbox Code Playgroud)

一个非泛型的类,它提供具体类型作为Pair超类声明的类型参数.

Java语言规范描述了类声明语法.