|
|
|
Generics или я опять что-то не понял ...
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Вот последние два варианта ретёрна мне как-то не ясны ... Почему error или warning, если стирание происходит до типа "A" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2013, 17:18:20 |
|
||
|
Generics или я опять что-то не понял ...
|
|||
|---|---|---|---|
|
#18+
Из-за того что вы сделали chained вызов, похоже и запутались. "error - из "A" "T" не кастится " - Метод add возвращает тип A, метод some возвращает наследника A, например B. Очевидно что метод add может вернуть другого наследника, например С, который к B не приводится. Отсюда и "unchecked cast" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2013, 17:27:04 |
|
||
|
Generics или я опять что-то не понял ...
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Метод add возвращает тип AОчевидно что метод add может вернуть другого наследникаКак это другого, он же не параметризованный? Что А к Т не приведется без ругани и так понятно, это ж даункаст. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2013, 17:43:31 |
|
||
|
Generics или я опять что-то не понял ...
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Хммм... Если B это "B", то "B" не наследник "A" ... Если "A" это все-таки класс, а не интерфейс, то все наследники "А" должны приводиться к "A" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2013, 17:44:51 |
|
||
|
Generics или я опять что-то не понял ...
|
|||
|---|---|---|---|
|
#18+
_usa__83_, то все наследники "А" должны приводиться к "A" ?у вас же в примере наоборот, вы приводите А к его наследнику, к Т ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2013, 17:48:01 |
|
||
|
Generics или я опять что-то не понял ...
|
|||
|---|---|---|---|
|
#18+
javapecker, Во путаница (у меня) ... 1. T extends A - значит что подстановочный тип может быть либо "A" либо его наследником ... 2. Если на этапе выполнения я подпихиваю какой-нибудь экземпляр класса "C" (class C extends A ...) то в методе some() должен вызываться метод add() класса "C" (?) который может вернуть какой-нить экземпляр класса "C" (?) но который должен приводиться таки к "A" ? кхе-кхе ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2013, 17:56:50 |
|
||
|
Generics или я опять что-то не понял ...
|
|||
|---|---|---|---|
|
#18+
_usa__83_, Если на этапе выполнения я подпихиваю какой-нибудь экземпляр класса "C" (class C extends A ...) то в методе some() должен вызываться метод add() класса "C"(?) который может вернуть какой-нить экземпляр класса "C" (?) но который должен приводиться таки к "A" ? Разумеется С приведется к А. Но у метода some возвращаемое значение не А, а некоторый тип Т, унаследованный от А. Пусть А это посуда, Т это сковородка, С это кастрюля. Сковородка это посуда, кастрюля это посуда, но кастрюля это не сковородка. Если ваш класс будет параметризован сковородкой, а метод add вернет кастрюлю, то вам придется приводить кастрюлю к сковородке. Конечно компилятор на это ругается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2013, 18:06:55 |
|
||
|
Generics или я опять что-то не понял ...
|
|||
|---|---|---|---|
|
#18+
javapecker, С кастрюлями и сковородками очень наглядно (правда), но суть все же ускальзает, может я путаю этап компиляции и выполнения ? В приведенном коде класс "B" параметризован "A" или его наследниками, значит в момент создания тип содержимого контейнера определен четко: если сковородка - значит сковородка ... Когда вызывается метод add() у фактического элемента ArrayList<Сковородка> это будет метод с какой сигнатурой (Cковородка add(Cковородка a); A add(A a); Cковородка add(A a); Кастрюля add(Сковородка а) и .т.д.)? т.е. с чего бы ему возвращать иного потомка класса "A" вне цепочки иерархии от "A" до сковородка? Понятно что это можно реализовать но только ли в этом проблема ? уф)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2013, 18:26:11 |
|
||
|
Generics или я опять что-то не понял ...
|
|||
|---|---|---|---|
|
#18+
_usa__83_,это будет метод с какой сигнатурой Исходные данные - есть класс А и есть B. Больше нет ничего. У вас параметр T extends A. Идем в класс А и смотрим сигнатуру add. Видим A add(A a). Таким образом, все что знает B о методе add, это что он вернет A. Все что знает B о параметре Т - то что это наследник А. поэтому в методе some() выполняется приведение А к T extends A, то есть родителя к наследнику - это даункаст, и вы должны сами решать, можно так делать или нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2013, 18:36:40 |
|
||
|
Generics или я опять что-то не понял ...
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2013, 21:03:47 |
|
||
|
Generics или я опять что-то не понял ...
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Угу, пасиба всем, сваял только аналогичное ... Действительно ClassCastException ... Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. javapecker - Вы правы, от формализма синтаксиса не уйти, пример, как показали, сочиним ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2013, 22:35:04 |
|
||
|
|

start [/forum/topic.php?fid=59&gotonew=1&tid=2128303]: |
0ms |
get settings: |
7ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
191ms |
get topic data: |
10ms |
get first new msg: |
6ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
| others: | 189ms |
| total: | 496ms |

| 0 / 0 |
