В чем разница между этими утверждениями в родовом классе?

Я все еще узнаю о дженериках и задаю вопрос. Скажем, у вас был этот общий класс:

public class Test<T> {

    public static void main (String[] args) {
        Test t1 = new Test();
        Test<String> t2 = new Test<String>();
        Test t3 = new Test<String>();
    }
}

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

Ответ 1

Test t1 = new Test();

Здесь вы используете Необработанный тип. то есть не передавать Type argument для generic clas s.

Компилятор должен дать вам предупреждение здесь

Тест является сырым типом. Ссылки на общий тип Тест должен быть    параметризованных

    Test<String> t2 = new Test<String>();

здесь вы используете дженерики. передав String как Type argument на ваш generic class.

    Test t3 = new Test<String>();
Компилятор

также должен дать вам предупреждение:

  • Тест является сырым типом. Ссылки на общий тип Тест должен быть параметризован

так же, как ваш первый случай, но вы используете параметризованный тип при вызове конструктора.

Существует еще один класс, который отлично работает в версиях + java 7.

    Test<String> t4 = new Test<>();

Предупреждение компилятора здесь не используется, если вы используете + java 7 из-за вывода типа

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

Ответ 2

Общие данные дают вам проверки типа времени компиляции.

Это помогает добавить примеры того, что вы можете/не можете сделать с вашими товарами (для удобства примеров я изменил Test на ArrayList):

    ArrayList t1 = new ArrayList();
    ArrayList<String> t2 = new ArrayList();
    ArrayList t3 = new ArrayList<String>();

    // First list can have ANYTHING added to it
    // Compiler won't check because no generics
    t1.add(new Integer("7"));
    t1.add("Hello");

    // Second list can only have Strings added to it
    // Compiler will check and throw compile error for anything else
    t2.add(new Integer("7"));   // doesn't compile
    t2.add("Hello");

    // Third list is interesting...
    // Again, can have ANYTHING added to it
    // This is because generics (in Java...) are swapped out at COMPILE time
    //   rather than RUNTIME. The compiler can see that the actual type is just
    //   plain ArrayList
    // If you like, it similar to doing: 
    //   Object o = (String) new Object(); 
    // The net-effect is everything reduced back to Object
    t3.add(new Integer("7"));  // fine
    t3.add("Hello");

Ответ 3

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

t1 и t3 будут обрабатываться точно так же, потому что они одного типа - они будут рассматриваться как объект с классом Test, не более.

t2 будет рассматриваться более строго с точки зрения проверки типов. Если для компилятора появляется какая-то возможность использовать его общее качество <String>, то это качество также потребуется для соответствия.