Java 如何检查参数化类型的继承?

Java 如何检查参数化类型的继承?,java,generics,inheritance,Java,Generics,Inheritance,我正在创建一个实现java.util.List的类。我的类使用E来表示参数化类型 我想调用Collections.sort对我与类一起包装的内部列表进行排序。问题是,这要求我的列表具有实现可比较的类型 像sort方法一样,我希望能够使用comparator,所以我不想强迫E成为Comparable的子类。因此,在不使用比较器的构造函数中,我想验证E是否实现了Comparable 那么,强大的java向导们,我该怎么做呢?您可以使用instanceof操作符,如果E实现Comparable,那么对

我正在创建一个实现
java.util.List
的类。我的类使用
E
来表示参数化类型

我想调用
Collections.sort
对我与类一起包装的内部列表进行排序。问题是,这要求我的列表具有实现可比较的类型

像sort方法一样,我希望能够使用comparator,所以我不想强迫E成为Comparable的子类。因此,在不使用比较器的构造函数中,我想验证E是否实现了Comparable


那么,强大的java向导们,我该怎么做呢?

您可以使用
instanceof
操作符,如果E实现Comparable,那么
对象instanceof Comparable
将返回true。

像这样吗

class MyList<E extends Comparable> implements List<E> {
...
}

编译器需要有两个不同的类或两个生成器方法来检查这一点

CollectionOfAny<E> {
     CollectionOfAny(Comparator<? super E> comparator) {
     }

     public static <E> CollectionOfAny<E> create(Comparator<? super E> comparator) {
         return new CollectionOfAny<E>(comparator);
     }

     public static <E extends Comparator<E>> CollectionOfAny<E> create() {
         return new CollectionOfAny<E>(NaturalComparator.INSTANCE);
     }
}

CollectionOfComparable<E extends Comparable<E>> extends CollectionOfAny<E> {
     public CollectionOfComparable() {
         super(NaturalComparator.INSTANCE);
     }
}
collectionfany{

CollectionOfAny(Comparator用于查找接口

YourObject.class.getInterfaces();

private E ob;
    public void testComp(){
    ob.getClass().getInterfaces(); //try using this to get the class first
    }
///////////

public class run<E> implements Comparable{
private E ob;

public run(E ob){
    this.ob = ob;
}
public run() {}

public static void main(String[] args) {
        run r = new run<run>(new run()); //add an instance of the parametised object
        r.testComp();
}

@Override
public int compareTo(Object arg0) {
    // TODO Auto-generated method stub
    return 0;
}


public boolean testComp(){
System.out.println(ob.getClass().getInterfaces()[0].toString());
return ob.getClass().getInterfaces()[0].toString().equals("java.lang.Comparable");
}


}
公共类运行实现了可比较的{
私人E-ob;
公营(E-ob){
this.ob=ob;
}
公共运行(){}
公共静态void main(字符串[]args){
run r=new run(new run());//添加参数化对象的实例
r、 testComp();
}
@凌驾
公共整数比较对象(对象arg0){
//TODO自动生成的方法存根
返回0;
}
公共布尔testComp(){
System.out.println(ob.getClass().getInterfaces()[0].toString());
返回ob.getClass().getInterfaces()[0].toString().equals(“java.lang.Compariable”);
}
}
这将打印出“interface java.lang.Compariable”


字符串比较是一种解决方法,因为您不能使用instanceof,因为可比较接口本身需要参数化,但这会检查它是否属于可比较接口。欢迎进行任何编辑!

使用工厂方法。工厂方法在几乎所有方面都优于构造函数。稍后可能会返回一个更高的值没有Java 7和diamond运算符,特定类型、类型推断就可以正常工作,并且…对于不同的工厂方法,您可以要求不同的类型参数边界:

public static <E extends Comparable<? super E>> YourList<E> wrap(List<E> wrapped) {
  return new YourList<E>(wrapped);
}

public static这不是一个好方法。只需关闭并继续。

所以当您不提供比较器时,您想强制
E
实现
Comparable
,但不提供其他方法?我在构造时没有对象的实例,因此instanceof不起作用。正如我在问题中指出的,我不希望客户端有如果它们提供了比较器,则实现Comparable。当我尝试E.class.getGenericInterfaces()时,我得到一条消息:“类型参数E的非法类文字”我有一个测试正在进行,但它非常混乱,因此将在一分钟内发布它!我发布的方法需要一些个性化设置,最好的方法是将字符串名称与“java.lang.com”"好的,谢谢你的辛勤工作,但是再一次,当我需要这个的时候,我没有E的实例。如果我有,事情会变得更简单。你需要一个E的实例,例如,我只是在我的构造函数中使用了一个伪对象来创建一个,然后允许运行检查,否则你会得到一个空指针。对不起,这是我能想到的最好的方法了!也许是我还没有完全理解您的问题:)!我尝试过这样做,但排序方法对泛型仍然很古怪。我一直在使用比较器,并使用我自己的调用比较器的方法来使用自然顺序。这就是它的作用。re:
NaturalComparator.INSTANCE
我找不到类NaturalComparator。这是Java 7的新功能吗,因为我还在6级?这是你必须要写的;)如果你懒惰,你可以用
集合。reverseOrder(Collections.reverseOrder())
作为比较器;)有那么一秒钟,我以为Peter已经超过了我……但他的解决方案略有不同。
public static <E extends Comparable<? super E>> YourList<E> wrap(List<E> wrapped) {
  return new YourList<E>(wrapped);
}