Может ли язык быть «полным» без явного приведения типов? - PullRequest
1 голос
/ 07 марта 2012

Может ли язык программирования быть "полным" без наличия явного приведения ? По сути, есть ли что-нибудь , которое мы не можем сделать, используя язык, в котором отсутствует явное приведение типов?

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

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

Ответы [ 5 ]

5 голосов
/ 07 марта 2012

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

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

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");
}

Редактировать: «увеличение типа» исправлено на «расширение примитива».

2 голосов
/ 07 марта 2012

Конечно, возьмите, например, метод equals - он должен получить Object параметр. (и прочитайте эту великую главу Эффективной Java о равных и друзьях)

1 голос
/ 09 января 2014

В 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 не допускается.

0 голосов
/ 08 марта 2012

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

0 голосов
/ 07 марта 2012

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

...