如何检查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
比较器的子类,如下所示:
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;
}
}