2012-01-17 2 views
2

Что-то вроде следующего не даст мне ошибку времени компиляции или времени выполнения, и я рисую пустой вопрос о том, почему. Есть ли способ принудительно выполнить ошибку компиляции при вызове cls.add?Параметрированные списки в сигнатуре метода

Почему определение T в определении класса не переносится на вызов методов внутри? Я понимаю, что я не создавал класс таким образом, но определение состояний класса T должно быть числом.

public class NewClass<T extends Number> { 

    private List<T> id = new ArrayList<T>(); 

    public void add(List<T> elem) { 
     id.addAll(elem); 
    } 

    public static void main(String[] args) { 
     NewClass cls = new NewClass(); 
     cls.add(new ArrayList<String>()); 
    } 
} 

ответ

2

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

Если вы предоставите параметр типа, это не получится:

NewClass<Integer> cls = new NewClass<Integer>(); 
cls.add(new ArrayList<String>()); //error 
+0

Я понял, что это связано с использованием типа raw. Я подумал, может быть, был способ обеспечить определение Т с чем-то вроде public void add (Список elem) но не кубик. Спасибо за помощь. – sma

1

При создании экземпляра CLS, вам необходимо предоставить общий тип, например .:

NewClass<Integer> cls = new NewClass<Integer>(); 
+0

Нет, проверка все равно будет на 'cls', которая также нуждается в общем типе. Вы все еще используете исходный тип. – Thomas

+0

@Thomas Хороший улов. Ред. – GriffeyDog

1

Это приведет к предупреждению, поскольку использование дженериков отключена в этом случае (вы используете необработанный тип). То для соображений обратной совместимости. Вы можете заставить компилятор обрабатывать предупреждения как ошибки: Javac: Treat warnings as errors

+0

Хорошая точка. Никогда не думал о предупреждениях о лечении как о настройке ошибок. – sma

Смежные вопросы