2013-09-01 3 views
0

Являются ли они одинаковыми?Полиморфизм: присвоение дочернего класса суперклассу

ParentClass object=new ChildClass(); 

ParentClass object = (ParentClass) new ChildClass(); 

Если я хочу, чтобы создать карту, которая отображает строку Детских объектов как

"dog"->childA; 
"cat"->childB 

Как я должен объявить карту?

Map<String,Parent> 
or 
Mpa<String,T extends Parent> 

Я не уверен, что если второй является правильным или нет, но я читал где-то

ответ

0

Первые две одинаковые по сути. Кастинг не нужен.

Если вы хотите карту, чтобы содержать смесь дочерних классов, вам необходимо объявить

Map<String,Parent> 

Если вы объявляете

Map<String,T extends Parent> 

он объявляет карту от String к одному определенному классу ребенка тип T. Параметр type должен быть указан в другом месте (в качестве параметра типа для содержащего класса или метода размещения). Обратите внимание, что вы не можете создать экземпляр Map несвязанного типа. Так, например:

Map<String,? extends Parent> = new HashMap<String, ? extends Parent>(); 

генерирует ошибку компилятора. Лучшее, что вы можете сделать, это:

Map<String,? extends Parent> = new HashMap<String, Parent>(); 

в этом случае вы можете также придерживаться

Map<String,Parent> = new HashMap<String, Parent>(); 
5

ли оба одинаковы?

Кастинг не требуется при выполнении второго задания. Первое - действительное назначение. Вы можете назначить объект дочернего класса ссылке на суперклассу.

Как я могу объявить карту?

Вы должны объявить об этом в первую очередь. A Map<String, Parent> будет способен хранить экземпляры родительского или любого из его подклассов.

Что касается вашего 2 декларации:

Map<String, T extends Parent> // This won't compile 

это не правильный способ указать связанный в параметре типа при объявлении карты. Вы не можете использовать параметр ограниченного типа. Вы должны либо использовать подстановочный знак, либо просто параметр типа - Map<String, T>, с границами для T, объявляемых там, где вы объявляете этот тип (возможно, в родовом классе, где вы объявляете карту). Таким образом, вы можете использовать <? extends Parent>. Проблема с объявлением карты таким образом заключается в том, что вы не сможете ничего добавить в нее, принимаете null.

Похожие темы:

Ссылка:

1

Литой и не литой действительно то же самое.

Для общего, если вы объявите его с <String, ? extends Parent>, вы выиграли; t сможете добавлять вещи в список из-за того, что если было объявлено <String, Child>, родители не могли быть добавлены. Если NewChild был создан другим разработчиком, то мы не можем знать, если Parent, Child или NewChild используется, и записи не будут разрешены.

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