Мой тип IDE ( NetBeans ) проверяет мой, Collections
пока я набираю код. Но тогда, почему я должен бросить возвращенный объект Object.clone()
? Что хорошо. Нет вреда, нет фола. Но все же я не понимаю.
Является ли проверка типов без приведения возвращаемого объекта Object.clone()
невозможной? Дженерики структура заставляет меня думать IDE может проверить тип ссылок на объекты на правой стороне « = марки» без литья в то время как я печатаю? Я не понимаю
Приложение
Мой случай использования состоял в том, что у меня было личное Calendar
поле, pubdate . Я собирался написать:
Calendar getPubdate() {
return pubdate;
}
но есть риск, что вызывающий может изменить мою публикацию , поэтому я вернул копию:
Calendar getPubdate() {
return (Calendar) pubdate.clone();
}
Затем я удивился, почему мне нужно было сыграть pubdate.clone()
. Подпись метода имеет тип прямо здесь. NetBeans должен быть в состоянии понять это. И NetBeans, похоже, делал что-то подобное в отношении Collections
.
MyObject
с,clone()
а не сObject
- это устраняет всю эту проблему. Кроме того, рекомендуется никогда не использоватьclone()
(Эффективный элемент Java # 11).this.clone()
объект программиста, особенно ночью Ср после выхода Ту. Извините, но я должен написать этот комментарий .. Почему умная IDE не может просто исправить все ошибки для нас LOLОтветы:
Потому что это возвращается
Object
.Object.clone
не является общим.Если бы дженерики существовали, когда они
clone
были разработаны, это, вероятно, выглядело бы так (используя F-ограниченный полиморфизм):Если бы в Java была функция MyType, она могла бы выглядеть так:
Но Generics не существовало, когда она
Object.clone
была разработана, и у Java нет MyTypes, поэтомуObject.clone
нам приходится работать с небезопасной версией типа .источник
original
?Это не особенность какой-либо IDE, но определение языка.
IDE помогает вам более эффективно использовать язык программирования, но не меняет семантику этого языка. Это означает, что помощник редактора может автоматически вставить приведение, когда очевидно, какой вы хотите, но он не может просто нарушать правила языка и делать вид, что код, который не компилируется, действителен.
Редактировать Это правда, что IDE может связывать свой собственный компилятор, и на самом деле многие делают именно это, например, для лучшего сообщения об ошибках с большей внутренней информацией в частичное дерево разбора. Однако было бы очень плохой идеей позволить этому внутреннему компилятору реализовывать семантику языка, отличную от официального SDK, поскольку это означало бы, что код, работающий в разработке, может таинственным образом начать сбой при установке в производство, что порождает проблемы, которые по определению не отладка!
источник
Это связано с сигнатурой типа метода Object.clone. Сигнатура типа утверждает, что метод вернет объект типа Object.
Коллекции будут использовать так называемые универсальные типы для автоматической замены типа приведения.
Так что, если у вас есть этот код:
компилятор добавит приведенные для вас закулисные действия, поэтому код будет на самом деле:
источник
Для полноты, начиная с Java 5, допускаются ковариантные возвращаемые типы . Таким образом, вы можете написать следующее:
При этом допустим следующий код:
источник