Что такое типы raw в Java и почему я часто слышу, что они не должны использоваться в новом коде?
blockquote>Необработанные типы - это древняя история Java язык. В начале были
Collections
, и они больше не держалиObjects
и не меньше. Каждая операция наCollections
требовала отличных отObject
желаемого типа.List aList = new ArrayList(); String s = "Hello World!"; aList.add(s); String c = (String)aList.get(0);
Хотя это продолжалось большую часть времени, произошли ошибки
List aNumberList = new ArrayList(); String one = "1";//Number one aNumberList.add(one); Integer iOne = (Integer)aNumberList.get(0);//Insert ClassCastException here
Старый нетривиальные коллекции не могли обеспечить безопасность типов, поэтому программисту приходилось запоминать то, что он хранил в коллекции. Генераторы, изобретенные, чтобы обойти это ограничение, разработчик объявит сохраненный тип один раз, и компилятор сделает это вместо этого.
List
aNumberList = new ArrayList (); aNumberList.add("one"); Integer iOne = aNumberList.get(0);//Compile time error String sOne = aNumberList.get(0);//works fine Для сравнения:
// Old style collections now known as raw types List aList = new ArrayList(); //Could contain anything // New style collections with Generics List
aList = new ArrayList (); //Contains only Strings Более сложный Интерфейс Compareable:
//raw, not type save can compare with Other classes class MyCompareAble implements CompareAble { int id; public int compareTo(Object other) {return this.id - ((MyCompareAble)other).id;} } //Generic class MyCompareAble implements CompareAble
{ int id; public int compareTo(MyCompareAble other) {return this.id - other.id;} } Обратите внимание, что невозможно реализовать интерфейс
CompareAble
сcompareTo(MyCompareAble)
с необработанными типами. Почему вы не должны их использовать:
- Любое
Object
, хранящееся вCollection
, должно быть выполнено до его использования- Использование обобщений позволяет проверять время компиляции
- Использование исходных типов - это то же самое, что и сохранение каждого значения как
Object
Что делает компилятор: Дженерики обратно совместимы, они используют одни и те же классы java, типы делают.
List
someStrings = new ArrayList (); someStrings.add("one"); String one = someStrings.get(0); Будет скомпилирован как:
List someStrings = new ArrayList(); someStrings.add("one"); String one = (String)someStrings.get(0);
Это тот же код, который вы бы написали, если вы использовали исходные типы напрямую. Думаю, я не уверен, что происходит с интерфейсом
CompareAble
, я предполагаю, что он создает две функцииcompareTo
, одна из которых принимаетMyCompareAble
, а другая принимаетObject
и передает ее первой после ее литья.Каковы альтернативы сырым типам: используйте generics