|
|
|
Метод с арг. Set<? super SomeClass>: не работает for-each, но работает старый Iterator
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Есть класс "Химический элемент" с наследником - "Металл". Создаю коллекцию металлов, дальше передаю её в метод addSome(), в котором в эту коллекцию добавляется еще один металл. Если пробовать затем перебирать эту коллекцию через for-each, то обломится (см ниже). Если же пройтись по ней итератором, то всё пучком. Это почему так ? Код: 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. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. Ouitput: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 17:35:38 |
|
||
|
Метод с арг. Set<? super SomeClass>: не работает for-each, но работает старый Iterator
|
|||
|---|---|---|---|
|
#18+
ozzmosis, Код: java 1. В такой генерик можно только писать, прочитать из такой коллекции можно только Object, потому что неизвестно какой именно предок металла находится в коллекции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 17:47:53 |
|
||
|
Метод с арг. Set<? super SomeClass>: не работает for-each, но работает старый Iterator
|
|||
|---|---|---|---|
|
#18+
В Java туториале всё подробно описано http://docs.oracle.com/javase/tutorial/java/generics/lowerBounded.html Имеем список любых элементов. А почему любых, если мы делаем списое металлов? Set<Element> e; Это lower bounded wildcard. Set<? super Metal> m Значит что тут может быть Set<Object>, Set<Element> или Set<Metal> Поэтому компилятор требует для foreach самого обещего типа - object. Если бы это был аргумент Set<? extends Element> m Тогда там мог бы быть только Set<Element> или Set<Metal>. И компилятор при erasure мог бы ограничиться самым общим типом - Element. В случае итератора ты просто выкинул Generic тип. О чем компилятор выдаёт warning. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 17:49:30 |
|
||
|
Метод с арг. Set<? super SomeClass>: не работает for-each, но работает старый Iterator
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, автор Код: java 1. 2. 3. Но тогда не удалось бы в этом методе записать ничего в сет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 17:52:37 |
|
||
|
Метод с арг. Set<? super SomeClass>: не работает for-each, но работает старый Iterator
|
|||
|---|---|---|---|
|
#18+
javapeckerНо тогда не удалось бы в этом методе записать ничего в сет. Вопрос был про итератор. Не заметил, что там добавление. В общем добавление и итерация разные вещи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 18:00:24 |
|
||
|
Метод с арг. Set<? super SomeClass>: не работает for-each, но работает старый Iterator
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, согласен, это просто для полноты картины ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 18:02:15 |
|
||
|
Метод с арг. Set<? super SomeClass>: не работает for-each, но работает старый Iterator
|
|||
|---|---|---|---|
|
#18+
BlazkowiczВ Java туториале всё подробно описано http://docs.oracle.com/javase/tutorial/java/generics/lowerBounded.html нету там про for-each итерацию! и вот тута тоже нету (сказано только, что "You can get the iterator and invoke remove" - но про remove я и сам уже просёк :-)). BlazkowiczЭто lower bounded wildcard. Set<? super Metal> m Значит что тут может быть Set<Object>, Set<Element> или Set<Metal> Поэтому компилятор требует для foreach самого обещего типа - object. [Ключевая фраза. Всё ясно, спс! Код: java 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 19:02:20 |
|
||
|
Метод с арг. Set<? super SomeClass>: не работает for-each, но работает старый Iterator
|
|||
|---|---|---|---|
|
#18+
ozzmosis, автор Код: java 1. Итерация тут вообще ни при чем. Это по большому счету просто способ прочитать элемент из коллекции. Попробуйте просто прочитать get-ом. Получите то же самое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 19:14:13 |
|
||
|
Метод с арг. Set<? super SomeClass>: не работает for-each, но работает старый Iterator
|
|||
|---|---|---|---|
|
#18+
ozzmosis, и еще я не понимаю, почему у вас читается коллекция в методе addSome(), который судя по названию предназначен не для того чтобы печатать содержимое коллекции. В методе ShowAll() итератор прекрасно будет работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 19:22:13 |
|
||
|
Метод с арг. Set<? super SomeClass>: не работает for-each, но работает старый Iterator
|
|||
|---|---|---|---|
|
#18+
javapeckerпочему у вас читается коллекция в методе addSome(), который судя по названию предназначен не для того чтобы печатать содержимое коллекции.да тут всё просто: пока что ваяю примеры из учебника в простом текстовом редакторе, учусь типа :-) ну, вот и наткнулся, добавив for-each как "отладочный код". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 19:33:28 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=209&tid=2128564]: |
0ms |
get settings: |
13ms |
get forum list: |
23ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
288ms |
get topic data: |
16ms |
get forum data: |
5ms |
get page messages: |
126ms |
get tp. blocked users: |
2ms |
| others: | 289ms |
| total: | 774ms |

| 0 / 0 |
