2012-03-07 5 views
1

Может ли язык программирования быть «полным» без существования явное литье? В сущности, есть что-нибудь мы не можем сделать, используя язык, который не имеет явного типа литья?Может ли язык быть «полным» без явного литья типов?

Например, the post below демонстрирует, что Java требует явного ввода типов для записи настраиваемых классов универсального типа.

Есть ли другие примеры использования, где мы абсолютно Нужна явная литья?

ответ

2

Конечно, возьмите метод equals, например, он должен получить параметр Object. (и читать this great chapter of Effective Java относительно равных и друзей)

+0

Но мы можем сделать * все * без использования метода ** equals **, не так ли? Мне никогда не приходилось пользоваться ** равным **. С этим мы не можем обойтись? – Pacerier

+0

Зависит от того, как вы все определяете. Вы не можете использовать большинство коллекций без него, но вы можете сказать, что это также библиотека, в этом случае мой единственный ответ. ДА, мы можем полностью избежать кастинга, переписывая Java. – MByD

+0

И вы никогда не сравнивали строки? это также использование равных. – MByD

0

Я часто использую кастинг при работе с библиотеками, которые не построены с учетом дженериков, или когда мне нужно сбрасывать некоторые объекты для доступа к функциям, которые, как мне известно, реализуются подкласс, но не классом, который я использую в других случаях. Вероятно, разумно проверить с помощью предложения if (foo instanceof Bar) , прежде чем делать это.

+0

Вот что я говорю. Предполагая, что мы не используем библиотеки, которые не используют преимущества дженериков, зачем нам нужно кастинг? – Pacerier

+0

Конечно, мы делаем это, или это не будет на языке. Например, скажем, у меня есть метод, который я назвал, который выбрасывает «Исключение» - не самый полезный, но это происходит. Я могу сделать что-то вроде 'catch (Exception e) {if (e instanceof AxisFault) {System.err.println (((AxisFault) e) .getFaultString())} else {// сделать что-то другое}}' – David

+0

как я знаю, это на языке только потому, что дженерики не будут введены до самого начала. У вас есть метод, который выдает «Исключение». Единственная причина, по которой это происходит, - это **, потому что ** язык поддерживает кастинг. Я имею в виду, вы получаете то, что я пытаюсь сказать? – Pacerier

5

Вот некоторые

Чтобы отменить автоматический примитивный уширение:

byte blammy = (byte)(schmarr & 0xF7); 

Наследие Код:

public void oldSchoolMethod(List oldSchoolListOfStrings) 
{ 
    String firstValue = (String)oldSchoolListOfStrings.get(0); 
} 

HTTP код:

public String getSchmarr(HttpServletRequest request) 
{ 
    HttpSession session = request.getSession(); 
    return (String)session.getAttribute("Schmarr"); 
} 

Edit: "типа увеличивается" correcte d к «первообразному расширению».

+0

«автоматический тип увеличивается» - это не настоящее имя, но я не могу вспомнить настоящее имя. – DwB

+0

автоматическое расширение примитива –

+0

@DwB, нам не нужно кастинг, чтобы делать HTTP. Нам нужно только кастинг, если мы используем плохо написанную функцию 'session.getAttribute'. Я говорю, что это * плохо написано *, потому что функция просто возвращает 'Object' вместо более точного типа. Предполагая, что мы имеем функцию 'session.getStringAttribute (" x ")', тогда нам не нужны явные типы приведения вообще, правильно? – Pacerier

0

Когда мы десериализируем объект (например, из строки), нам необходимо вставить объект в класс, чтобы мы могли использовать его методы.

+0

Я использую [XStream] (http://xstream.codehaus.org/index.html) много для сериализации, мне обычно приходится передавать объект, который я получаю из метода 'xstream.fromXML (xml)', в тип Я требую. Есть ли лучший способ сделать это, чем кастинг? – Leesrus

+0

Теперь * лучше * на самом деле не определено, но так, чтобы вы знали, существует множество способов разбора xml: http://en.wikipedia.org/wiki/XML#Programming_interfaces – Pacerier

1

В Java нет способа объявить массив общего типа T. Например, он является недействительным объявить массив с помощью new T[10]:

public class List<T> { 
    T[] backing_array = new T[10]; // this line is invalid, 


    public T Item(int index) { 
     return backing_array[index]; // and therefore this line is invalid as well. 
    } 

    //etc... 

Лучшее альтернативное решение мы имеем это:

public class List<T> { 
    Object[] backing_array = new Object[10]; 

    public T Item(int index) { 
     return (T) backing_array[index]; // notice that a cast is needed here if we want the return type of this function to be T 
    } 

    //etc... 

Если отливка явного типа не существует в Java, было бы невозможно для создания общих списков массивов, поскольку объявление массива общего типа T не допускается.

Смежные вопросы