Разве умение бросать не разрушает цель типизированных переменных? - PullRequest
1 голос
/ 08 октября 2008

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

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

Я также знаю, что мое предположение - не единственная причина, по которой мы вводим переменные. Пожалуйста, расскажите о некоторых других причинах, по которым мы ввели языки.

Ответы [ 8 ]

13 голосов
/ 08 октября 2008

Суть в том, что строгая типизация позволяет компилятору проверять вещи для вас. и приведение позволяет отменять строгую типизацию при необходимости.

3 голосов
/ 08 октября 2008

Я собираюсь сказать "в основном нет".

Если вам нужно выполнить явное приведение, вы по-прежнему избегаете большинства проблем, связанных с динамической типизацией. Ваши методы все еще должны существовать в новом классе. Объекты все еще должны иметь некоторые иерархические отношения друг с другом.

Существует огромная разница между возможностью приведения XmlTextReader в TextReader и возможностью во время выполнения решить, что читатель имеет элемент, который называется «read» и может быть логическим или может быть методом. *

2 голосов
/ 08 октября 2008

так что печатать - это один из способов получить компилятор делает много проверок для нас и помогите нам немного

Да.

Однако, если мы введем приведение к типизированный язык, мы не вводим заново большинство проблем у нас было, когда не было умеет печатать переменные?

Да.

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

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

1 голос
/ 08 октября 2008

По крайней мере, на Java, не совсем. Вы можете использовать только ребенка ожидаемого класса. Поэтому, если ваш класс возвращает RuntimeException, вы не можете привести его к String, и вам не нужно приводить его для доступа к нему как к исключению (это родитель).

Вам нужно только привести его, чтобы сказать, что вы знаете, что это на самом деле дочерний элемент / реализация RuntimeException, и вам нужно получить доступ к тому, что ребенок знает об этом RuntimeException, но не знает.

Тем не менее, слишком много кастинга - это неприятный запах. Вы должны получать доступ к уникальному коду ребенка почти исключительно через открытые методы родителя - если вы часто бросаете, возможно, вы забыли это правило.

1 голос
/ 08 октября 2008

Да, строгие типы позволяют компилятору выполнять множество проверок за вас.

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

0 голосов
/ 08 октября 2008

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

Я не видел указанный язык, но следует отметить, что существуют разные степени в отношении кастинга.

C ++, например, имеет dynamic_cast, который будет возвращать NULL, если объект не может быть приведен к другому через его корабль отношений наследования.

const_cast отбросит константность объекта. Это может быть полезно для передачи объекта const методу, который не объявлен как const, но вы знаете, что он не изменит объект.

0 голосов
/ 08 октября 2008

При наборе текста также работают такие инструменты, как Visual Studios Intellisense, которые помогают повысить производительность.

Но кроме этого, Майк Б прав. Иногда вам просто нужно сделать что-то грязное, например, приведение интерфейсов к классам или long к int.

0 голосов
/ 08 октября 2008

Когда вы приводите код, вы явно просите компилятор ослабить его в противном случае строгую типизацию. Это позволяет вам выполнять проверку во время компиляции в 99% случаев, но при этом все равно смешивать типы, когда это абсолютно необходимо.

Несмотря на это, компилятор может находить «плохие» приведения во время компиляции, которые не имеют шансов когда-либо добиться успеха.

То, что включение литья сводит на нет преимущества строгой типизации, является ошибкой. Однако это можно сказать о чрезмерном использовании кастинга.

...