Параметризация типа объекта класса в Java - PullRequest
4 голосов
/ 24 июня 2009

Предположим, следующая структура объекта:

class Super {}

class SubA extends Super {}
class SubB extends Super {}

Я хочу иметь возможность иметь переменную, которая будет содержать объект класса для любого из моих подклассов. Я чувствую, что это должно сделать это:

Class<Super> classObj;

Тогда я хочу иметь возможность что-то вроде этого:

classObj = SubA.class;

или

classObj = SubB.class;

Это не работает, хотя. Я получаю следующую ошибку:

Type mismatch: cannot convert from Class<SubA> to Class<Super>

Есть идеи, почему? Что мне нужно исправить?

Ответы [ 3 ]

13 голосов
/ 24 июня 2009

Вам нужен ограниченный шаблон :

Class<? extends Super> classObj;

См. Урок по шаблонам из учебных пособий по Java.

1 голос
/ 24 июня 2009

Попробуйте это (не компилируется):

public class ListCopy {
  public static void main(String[] args) {
    List<String> stringList = new ArrayList<String>();
    List<Object> objectList = stringList;
  }
}

Это не удастся скомпилировать, даже если String расширяет Object. Вещи Java не ковариантны - параметры типа стираются, поэтому компилятор не знает, что там будет во время выполнения.

То же самое с классом.

1 голос
/ 24 июня 2009

Как отметил ммайерс, вы можете использовать подстановочные знаки.

В качестве альтернативы вы можете заставить классы реализовывать общий интерфейс и затем обращаться к ним через этот интерфейс.

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