>Почему же нельзя? Вполне можно, для этого и Set заведён. У TreeSet и HashSet разные ограничения на типы, которые можно помещать в контейнер, поэтому можно выбрать что-то одно: либо иметь возможность использовать TreeSet и HashSet взаимозаменяемо, либо безопасно. И Sun правильно сделали это в библиотеке, лучше -- при таком полиформизме как в жабе, не получится.
>Ну, не думайте, если боитесь. Мы не боимся. Ну и как же там надо написать, чтобы можно было: (Возьмите уж сишарп, если жаба настолько убога). complex<double> sum; complex<float> foo(int) { /*...*/ } for(/*...*/) sum+=foo(/*...*/); И параметром complex может быть не double и float, но и любой тип, который заранее неизвестен.
>Они дают параметрический полиморфизм, которого без них не было. Позволяют убрать лажу с тайпкастами. Делают код безопаснее. В тривиальных случаях -- да. Но даже в TreeSet & HashSet тайпкаст остался.
no subject
Date: 2010-02-25 04:48 am (UTC)У TreeSet и HashSet разные ограничения на типы, которые можно помещать в контейнер, поэтому можно выбрать что-то одно: либо иметь возможность использовать TreeSet и HashSet взаимозаменяемо, либо безопасно. И Sun правильно сделали это в библиотеке, лучше -- при таком полиформизме как в жабе, не получится.
>Ну, не думайте, если боитесь. Мы не боимся.
Ну и как же там надо написать, чтобы можно было: (Возьмите уж сишарп, если жаба настолько убога).
complex<double> sum;
complex<float> foo(int) { /*...*/ }
for(/*...*/) sum+=foo(/*...*/);
И параметром complex может быть не double и float, но и любой тип, который заранее неизвестен.
>Они дают параметрический полиморфизм, которого без них не было. Позволяют убрать лажу с тайпкастами. Делают код безопаснее.
В тривиальных случаях -- да. Но даже в TreeSet & HashSet тайпкаст остался.