2016-03-15 4 views
2

Я получаю «Непроверенное задание: java.util.List до java.util.List<java.lang.Integer>» на линии с комментарием. Предупреждение очищается, когда параметр GetList изменяется на GetList<?>.Предупреждение о непроверенном назначении при отсутствии класса отсутствует общий тип

Я не понимаю, почему общий тип GetList повлияет на результат getIntegerList(). Пробовал как Intellij Idea, так и Eclipse. Нормально ли это или неверное предупреждение?

import java.util.ArrayList; 
import java.util.List; 

public class GetList<T> { 
    private final List<Integer> integerList= new ArrayList<Integer>(); 

    public List<Integer> getIntegerList() { 
     return integerList; 
    } 
} 


import java.util.List; 

public class Main { 
    public Main(GetList getList) { 
     List<Integer> rahan = getList.getIntegerList(); //this line shows the warning above 
    } 
} 
+2

Использования rawtypes всегда вызывает это предупреждение. Кстати, вам действительно нужен параметр '' в вашем классе 'GetList'? –

+0

Это не имеет никакого отношения к Java. Я пробовал ваш код в Intellij, и он не показывал никаких предупреждений. Это должна быть ваша IDE, которая неправильно интерпретирует –

+2

@RaduIonescu или, может быть, это ваша IDE, потому что я могу воспроизвести ее с помощью 'javac -Xlint: warning'. –

ответ

0

Если вы используете сырые типы вы должны ожидать любое количество странных предупреждений, и эти предупреждения не обязательно будут соответствовать между составителями (вы вводите «неопределенное поведение» территорию).

Как Энди Тернер и римской записке в комментариях это прописано в JLS §4.8 (курсив мой):

Тип конструктора (§8.8), метод экземпляра (§8.4, §9.4) или нестатическое поле (§8.3) необработанного типа C, которое не унаследовано от его суперклассов или суперинтерфейсов является необработанным типом, который соответствует стиранию его типа в общем объявлении, соответствующем C.

Другими словами, компилятору разрешено отбрасывать все общую информацию о классе, когда он используется как необработанный тип.

Вот еще один пример (с немного более четким сообщением об ошибке):

$ cat Demo.java 
import java.util.*; 

class Demo<T> { 
    public List<Integer> ls() { return new ArrayList<>(); } 

    public static void main(String[] args) { 
    List<Integer> ls = new Demo().ls(); 
    } 
} 

$ javac -Xlint:unchecked Demo.java 
Demo.java:7: warning: [unchecked] unchecked conversion 
    List<Integer> ls = new Demo().ls(); 
            ^
    required: List<Integer> 
    found: List 
1 warning 
Смежные вопросы