Как проверить наследование по параметризованному типу? - PullRequest
1 голос
/ 19 января 2012

Я создаю класс, который реализует java.util.List. Мой класс использует E для представления параметризованного типа.

Я хочу позвонить Collections.sort, чтобы отсортировать внутренний список, который я упаковываю в свой класс. Проблема в том, что для этого требуется, чтобы в моем списке были типы, которые реализуют сопоставимые.

Как и метод сортировки, я хочу использовать компаратор, поэтому я не хочу, чтобы E был подклассом Comparable. Итак, в конструкторе, который не использует компаратор, я хочу убедиться, что E реализует Comparable.

Итак, как мне это сделать, о могущественные волшебники Java?

Ответы [ 6 ]

1 голос
/ 19 января 2012

Используйте заводской метод.Фабричные методы превосходят конструкторы практически во всех отношениях.Позже можно вернуть более конкретный тип, вывод типа работает отлично без Java 7 и оператора diamond, и ... вы можете требовать разные границы параметров типа для разных заводских методов:

public static <E extends Comparable<? super E>> YourList<E> wrap(List<E> wrapped) {
  return new YourList<E>(wrapped);
}
1 голос
/ 19 января 2012

Вы хотите использовать, чтобы найти интерфейсы

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");
}


}

Это распечатывает "интерфейс java.lang.Comparable".

Сравнение строк - это обходной путь, поскольку вы не можете использовать instanceof, потому что сам интерфейс Comparable должен быть параметризован, но он проверяет, имеет ли он сопоставимый интерфейс. Любые изменения приветствуются!

1 голос
/ 19 января 2012

Вам нужно иметь два разных класса или два метода компоновщика, чтобы компилятор мог это проверить.

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);
     }
}
0 голосов
/ 18 марта 2012

Нет хорошего способа сделать это. Просто закрываюсь и двигаюсь дальше.

0 голосов
/ 19 января 2012

Как это?

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

ОБНОВЛЕНИЕ

Тогда это идея - создать фабрику с двумя статическими методами: сначала создаст список для ComparableРазработчики и второй метод создает ваш список для не Comparable.

Вот пример кода:

public class MyListFactory {
    static class OthersComparator implements Comparable{
        public int compareTo(Object o) {
            return 0;
        }
    }

    public static class MyList<E> {
        private final OthersComparator comparator;

        private final List<E> impl;

        private MyList() {
            this(null);
        }

        private MyList(OthersComparator comparator) {
            this.comparator = comparator;
            impl = new ArrayList<E>();
        }

        public void sort() {
            if (comparator == null) {
            } else {
            }
        }
    }

    static <E extends Comparable> MyList<E> getForComparable(Class<E> aClass) {
        System.out.println("for comparables");
        return new MyList<E>();
    }

    static <E> MyList<E> getForOthers(Class<E> aClass) {
        System.out.println("for non-comparables");
        return new MyList<E>(new OthersComparator());
    }

    public static void main(String[] args) {
        MyListFactory.MyList<Object> l = MyListFactory.getForOthers(Object.class);
        MyListFactory.MyList<Integer> l2 = MyListFactory.getForComparable(Integer.class);
    }
}
0 голосов
/ 19 января 2012

Вы можете использовать оператор instanceof, object instanceof Comparable вернет true, если E реализует Comparable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...