如何检查Java泛型类型是否是Comparator的子类?

如何检查Java泛型类型是否是Comparator的子类?,java,generics,Java,Generics,当我试图完成一项任务时,有一种情况需要处理:类的泛型类型的抛出异常是不可比较的。有关详细信息,请参阅以下代码 public class C <T> { public C() { // throw exception if T is not comparable } } 公共C类 { 公共C() { //如果T不可比较,则抛出异常 } } 您应该通过以下方式确保通用参数T是可比较的: publi

当我试图完成一项任务时,有一种情况需要处理:类的泛型类型的抛出异常是不可比较的。有关详细信息,请参阅以下代码

 public class C <T>
    {
        public C()
        {
            // throw exception if T is not comparable
        }
    }
公共C类
{
公共C()
{
//如果T不可比较,则抛出异常
}
}

您应该通过以下方式确保通用参数T是可比较的:

public class C <T extends Comparable>
公共C类
有两种方法:

1) 让它具有可比性,这样你就知道它永远都是可比的


2) 在构造函数中,将Class作为参数传递,以便在运行时知道T是什么。(因为它已被擦除)

您可以强制将泛型作为
比较器的子类,如下所示:

public class C <T extends Comparator> {
    public C(){
    }
}
您通常以
txk
的形式使用它,其中
T
是泛型,
x
super
extends
并且
K
是类/接口

public class C <T implements <interface what you want> >

Comparator添加一个通用约束,这会更好,因为它将在编译时处理它,而不是在运行时抛出异常

class C <T extends Comparable>
C类

您应该验证您的参数T是否具有可比性

 public class C <T extends Comparable>
公共C类
如果希望泛型类型实现某个接口,则也是如此

public class C <T implements <interface what you want> >
公共C类
或者如果你想的话,那是另一个的超类

public class C <T super <class what you want> > 
公共C类

如果您总是希望类型
T
实现
Comparable
,您可以按如下方式强制执行

public class C<T extends Comparable<? super T>> {

    public C() {

    }
}
如果类型
T
并不总是实现
Comparable
,但是您需要一个只适用于
Comparable
类型的特定构造函数,那么答案是您不能用构造函数来实现,但可以用静态方法来实现

public class C<T> {

    public C() {
        // Constructor that works with any T
    }

    public static <T extends Comparable<? super T>> C<T> getNew() {
        C<T> c = new C<>();
        // Do stuff that depends on T being Comparable
        return c;
    }
}
公共C类{
公共C(){
//与任何T一起工作的构造函数
}

public static泛型类的子类可以使用反射获得泛型类型:谢谢你的回答,但是这个类也可以接受不是Comparator子类的类;还有另一个函数可以为它分配Comparator。这个类也可以接受不是Comparator子类的类;还有另一个函数打开为其分配比较器。若键不可比较,且未分配比较器,则引发异常。
public class C<T> {

    public C() {
        // Constructor that works with any T
    }

    public static <T extends Comparable<? super T>> C<T> getNew() {
        C<T> c = new C<>();
        // Do stuff that depends on T being Comparable
        return c;
    }
}