У меня есть список объектов класса, все из которых необходимо расширить класс с помощью универсального типа. Вот мой код:Странная ошибка со списком общих классов
private final List<Class<? extends A<?>>> CLASS_LIST =
Arrays.asList(B.class, C.class, D.class);
// Base class
private abstract class A<T extends Object> {}
// Some class that extends A
private class B extends A<String> {}
// Some other class that extends A
private class C extends A<String> {}
// A class that extends A, but with a different type than the first two
private class D extends A<OtherClass> {}
private static class OtherClass {}
Это прекрасно работает, но если я удалить D.class из списка я получаю сообщение об ошибке сказав:
Incompatible types, Required A<?>, found A<String>
Почему это происходит? Я предполагаю, что Java передает тип ... но почему? И есть ли способ обойти это? Я обнаружил, что если я использую List<?>
, он работает во всех случаях, но затем я теряю безопасность типа.
EDIT: Кроме того, если бы я тогда есть этот метод:
private void Check(){
A a = new B();
if(CLASS_LIST.contains(a.getClass())){
// Do something
}
}
Это дает мне предупреждение о подозрительном вызова List.contains(...)
. Однако, если я использую List<?>
, предупреждение уходит ... почему это?
EDIT2: Java 1.8.0_51-b16 компилируется, но Java 1.7.0_79 дает ошибку.
Примечание: 'A' существует только для простоты, в действительности это расширяет что-то еще. –
Squeazer
Я бегу без ошибок, вы имели в виду CLASS_LIST = Arrays.asList (B.class, C.class); вызывает ошибку? – yelliver
Да, это вызывает у меня ошибку. Использование IntelliJ Ultimate 15, компиляция с jdk 1.7.0_79, устанавливается в Java 7. Если я пытаюсь его скомпилировать, он дает ошибку Несовместимые типы. – Squeazer