Будут ли полезны автоматические приведения? - PullRequest
0 голосов
/ 19 сентября 2008

Есть ли какие-либо недостатки или потенциальные проблемы для изменения компилятора Java на автоматическое приведение? В приведенном ниже примере результат list.get (0) будет автоматически приведен к типу переменной hi.

List list = new ArrayList();
list.add("hi");
String hi = list.get(0);

Я знаю, что дженерики позволяют вам сократить использование, но они делают это за счет усложнения декларации. Для меня преимущество дженериков состоит в том, что они позволяют компилятору применять больше правил, а не уменьшают приведение (но я их не очень часто использую, поэтому я несколько не информирован). Это предложение только уменьшит количество набираемого кода, а не переместит его в другое место. Также есть случаи, когда дженерики не могут быть использованы, потому что коллекция может иметь разные объекты. Если это «выглядит слишком удивительно» в зависимости от текущего использования, возможно, может быть изменена синтаксис для его использования.

От: http://jamesjava.blogspot.com/2007/01/automatic-casting.html

Ответы [ 6 ]

6 голосов
/ 19 сентября 2008

Приведение - это явная инструкция для компилятора Java, игнорирующая безопасность типов, поэтому автоматическое приведение может удалить одну из функций, специально предназначенных для языка.

Мне лично нравятся предупреждения и ошибки компилятора, поскольку гораздо сложнее найти проблему такого типа во время выполнения (при условии, что компилятору каким-то образом удалось заставить один тип объекта использовать другой).

5 голосов
/ 19 сентября 2008

Да, это приведет к перемещению ошибок, которые в настоящее время обнаруживаются во время компиляции, во время выполнения. Хотя некоторые не считают это большим недостатком, эти люди используют Python, Ruby или Perl, а не Java; -).

4 голосов
/ 19 сентября 2008

Самым большим преимуществом использования обобщений в вашем примере является то, что он превращает ошибку времени выполнения в ошибку времени компиляции.

List list = new ArrayList();
list.add(new Integer(42));
String hi = (String) list.get(0); // run time error

List<String> list = new ArrayList<String>();
list.add(new Integer(42)); // compile time error
String hi = list.get(0);

Поскольку ошибки времени выполнения видны пользователями, а ошибки времени компиляции - программистами, ошибки времени компиляции намного, намного лучше.

Чтобы ответить на ваш вопрос, не было бы никаких серьезных сбоев, если бы приведения производились автоматически (и ClassCastException все еще генерировался во время выполнения в вашем примере). Преимущество необходимости явного приведения заключается в том, что кодер должен думать о том, что он делает, и понимать, что происходит приведение.

Также есть случаи, когда дженерики не могут быть использованы, потому что коллекция может иметь другой объект

Вы можете добавлять различные объекты в общую коллекцию, используя подстановочные знаки.

1 голос
/ 19 сентября 2008

Мне кажется, что проверка типов - это хорошо. Автоматическое приведение устранит потенциально полезную ошибку во время компиляции.

Если вас беспокоит количество нажатий клавиш, вы можете использовать IDE, например Eclipse, где приведение типов можно вставить с помощью двойного щелчка.

1 голос
/ 19 сентября 2008

Я бы избегал этого, потому что у меня есть чувство, что он вернется и укусит вас позже. Дженерики стоят хлопот, на мой взгляд, потому что они избавляют от головной боли в будущем. Кроме того, не так сложно использовать объект-контейнер для коллекций, содержащих объекты разных типов.

0 голосов
/ 19 сентября 2008

Как уже говорили другие, автоматическое приведение типов устраняет безопасность типов. Дженерики имеют множество преимуществ и на самом деле не сложнее заявить. С Eclipse вы можете просто объявить универсальную переменную, а затем использовать автозаполнение при создании экземпляра, и он автоматически заполнит используемый вами тип. Кроме того, вы (или, возможно, что еще важнее, кто-то еще) имеет преимущество в том, что вы сразу же знаете, что именно содержит этот список или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...