Разница между ссылкой на экземпляр параметризованного типа для его необработанного типа и использования необработанного типа для ссылки на другой экземпляр необработанного типа? - PullRequest
0 голосов
/ 10 ноября 2018

Я недавно начал изучать Java с основ, и я сталкиваюсь с этим «небольшое» недоразумение о родовых типах, и оно подняло вопрос следующим образом:

Какая разница между ссылкой экземпляра параметризованного типа на его необработанный тип и использование необработанного типа для ссылки на другой экземпляр необработанного типа?

Я имею в виду, в чем разница между этим фрагментом:

ArrayList rawTypeList_NoRawInstance = new ArrayList</*Any type here*/>();

и этот:

ArrayList rawTypeList_RawInstance = new ArrayList();

Код:

import java.util.*;


public class TestGenerics{

   public static void main(String args[]){


          ArrayList rawTypeList_RawInstance = new ArrayList();
          ArrayList rawTypeList_NoRawInstance = new ArrayList<Integer>();  /* instead of Integer could be placed any kind of type, this 
                                                                            * is just an example */

          rawTypeList_RawInstance.add("example RawInstance");      // warning launched
          rawTypeList_NoRawInstance.add("example NoRawInstance");  // same warning here

          System.out.println(rawTypeList_RawInstance.get(0));      // content showed without errors/warning
          System.out.println(rawTypeList_NoRawInstance.get(0));    // same here

          String exampleRawInstance1    = (String)rawTypeList_RawInstance.get(0);   // raw type instance compiled without error 
          String exampleNoRawInstance1  = (String)rawTypeList_NoRawInstance.get(0); //  Generic type -Integer- instance compiled without error 

          Integer exampleRawInstance2   = (Integer)rawTypeList_RawInstance.get(0);      // ClassCastException as expected
          Integer exampleNoRawInstance2 = (Integer)rawTypeList_NoRawInstance.get(0);    // same here, logically
   }

}

Может ли кто-нибудь объяснить мне разницу и привести несколько примеров возможных возможных последствий?

1 Ответ

0 голосов
/ 10 ноября 2018

Обобщения присутствуют только во время компиляции, они будут удалены компилятором (это называется стиранием типов). Они предназначены для предоставления некоторой информации о типе компилятору. Это помогает вам избежать приведения типов (как обычно до Java 1.5) и позволяет компилятору для большей проверки типов. Это также ценная информация для программиста, например, если вы видите универсальный тип в интерфейсе.

Без генериков:

ArrayList list = new ArrayList();

Таким образом, это будет иметь значение, если вы напишите:

ArrayList</*Any type here*/> list = new ArrayList<>();

Теперь у компилятора есть информация о типах объектов list.

Но эта версия не имеет никакого значения для версии без генериков:

ArrayList list = new ArrayList</*Any type here*/>();

Список переменных не сопровождается обобщенной информацией, поэтому он так же хорош (или плох), как и версия без обобщений.

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