Что такое необработанный тип и почему мы не должны его использовать? - PullRequest
600 голосов
/ 05 мая 2010

Вопросы:

  • Что такое необработанные типы в Java и почему я часто слышу, что их не следует использовать в новом коде?
  • Какая альтернатива, если мы не можем использовать необработанные типы, и как она лучше?

Ответы [ 15 ]

5 голосов
/ 16 июня 2010

Что говорит о том, что ваш list является List неуказанных объектов. То есть Java не знает, какие объекты находятся внутри списка. Затем, когда вы хотите выполнить итерацию списка, вы должны привести каждый элемент, чтобы иметь возможность доступа к свойствам этого элемента (в данном случае, String).

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

private static List<String> list = new ArrayList<String>();
4 голосов
/ 24 мая 2016

страница учебника .

Необработанный тип - это имя универсального класса или интерфейса без аргументов типа. Например, учитывая общий класс Box:

public class Box<T> {
    public void set(T t) { /* ... */ }
    // ...
}

Чтобы создать параметризованный тип Box, вы указываете фактический аргумент типа для параметра формального типа T:

Box<Integer> intBox = new Box<>();

Если фактический аргумент типа опущен, вы создаете необработанный тип Box:

Box rawBox = new Box();
1 голос
/ 07 марта 2016

Я нашел эту страницу после выполнения некоторых типовых упражнений и с точно такой же загадкой.

============== Я вышел из этого кода, как показано в примере ===============

public static void main(String[] args) throws IOException {

    Map wordMap = new HashMap();
    if (args.length > 0) {
        for (int i = 0; i < args.length; i++) {
            countWord(wordMap, args[i]);
        }
    } else {
        getWordFrequency(System.in, wordMap);
    }
    for (Iterator i = wordMap.entrySet().iterator(); i.hasNext();) {
        Map.Entry entry = (Map.Entry) i.next();
        System.out.println(entry.getKey() + " :\t" + entry.getValue());
    }

====================== К этому коду ====================== ==

public static void main(String[] args) throws IOException {
    // replace with TreeMap to get them sorted by name
    Map<String, Integer> wordMap = new HashMap<String, Integer>();
    if (args.length > 0) {
        for (int i = 0; i < args.length; i++) {
            countWord(wordMap, args[i]);
        }
    } else {
        getWordFrequency(System.in, wordMap);
    }
    for (Iterator<Entry<String, Integer>> i = wordMap.entrySet().iterator(); i.hasNext();) {
        Entry<String, Integer> entry =   i.next();
        System.out.println(entry.getKey() + " :\t" + entry.getValue());
    }

}

=============================================== ================================

Может быть, безопаснее, но понадобилось 4 часа, чтобы разобраться в философии ...

0 голосов
/ 26 марта 2019

Избегайте необработанных видов

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

Например ,

Список является необработанным типом, а List<String> является параметризованным типом.

Когда дженерики были представлены в JDK 1.5, необработанные типы сохранялись только для обеспечения обратной совместимости со старыми версиями Java. Хотя использование необработанных типов все еще возможно,

Их следует избегать :

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

    import java.util.*;
    
    public final class AvoidRawTypes {
    
    void withRawType() {
    
        //Raw List doesn't self-document, 
        //doesn't state explicitly what it can contain
    
        List stars = Arrays.asList("Arcturus", "Vega", "Altair");
    
        Iterator iter = stars.iterator();
    
        while (iter.hasNext()) {
    
            String star = (String) iter.next(); //cast needed
    
            log(star);
        }
    
    }
    
    void withParameterizedType() {
    
        List < String > stars = Arrays.asList("Spica", "Regulus", "Antares");
    
        for (String star: stars) {
    
            log(star);
        }
    
    }
    
    private void log(Object message) {
    
        System.out.println(Objects.toString(message));
    
    }
    
    }
    

Для справки : https://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html

0 голосов
/ 04 декабря 2017

Необработанные типы хороши, когда они выражают то, что вы хотите выразить.

Например, функция десериализации может возвращать List, но она не знает тип элемента списка. Так что List является подходящим типом возврата здесь.

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