2013-08-29 2 views
0

У меня есть два класса: кластер суперкласса и подкласс XCluster. XCluster расширяет кластер.Почему карта со значениями суперкласса не может принимать объекты подкласса?

У меня есть эта подпись метода:

public Map<Integer, XCluster> getClusters() { 
... 
} 

У меня есть эта переменная:

Map<Integer, Cluster> clusters = getClusters(); 

Я не могу скомпилировать это. Eclipse говорит, что метод getCluster() не возвращает такой тип. Мне нужно изменить тип с XCluster на Cluster.

Что случилось?

+1

Подобный вопрос несколько минут назад. Здесь: http://stackoverflow.com/questions/18513990/why-is-it-not-possible-to-call-listnumber-not-with-listinteger-even-intege –

ответ

3

Вы не можете, потому что: generics in Java are not polymorphic

ваших основных вариантов (есть и другие):

  • изменить второй код

    Map<Integer, ? extends Cluster> clusters = getClusters(); 
    
  • изменить метод подписи к:

    public Map<Integer, Cluster> getClusters() {} 
    

Это зависит от вашего варианта использования.

3

Рассмотрите, что произойдет, если вы попытаетесь вставить Cluster в clusters. Поскольку результат getClusters() может содержать только XCluster s, должна быть ошибка. Вы правы, однако, что если какое-либо значение вы извлечь из карты будет Cluster, так что вы могли бы сделать, например,

Cluster cluster = getClusters().get(0); 
2

потому Map<Integer, XCluster> не Map<Integer, Cluster>. Дженерики не работают таким образом с полиморфизмом. Вы можете прочитать о и this question

0

Java не может решить, что столбец значений содержит суперкласс. Он не будет проверять этот гранулированный уровень.

1

Java-дженерики не позволят вам это сделать. Объектом типа Map<Integer, XCluster> не является объект типа Map<Integer, Cluster>, даже если XCluster расширяет или реализует Cluster, как описано здесь: Generics, Inheritance, and Subtypes.

Смежные вопросы