Это не проблема с генериками per se .
На самом деле предупреждение об устаревании относится к этой строке:
s2.SetData(new Integer(5))
Конструктор Integer(int)
всегда имеетЭто была плохая идея, и теперь она официально устарела (Java 9 и далее). javadoc говорит об этом:
" устарело. Редко уместно использовать этот конструктор. Статическое значение фабрики обычно устанавливается как oF (int)лучший выбор, поскольку он, вероятно, даст значительно лучшую производительность в пространстве и времени. "
Вы должны написать выше как
s2.SetData(Integer.valueOf(5))
или еще лучше:
s2.SetData(5)
и рассчитывать на автобокс.
Проблемы с new Integer(5)
:
семантика немного другая;например,
new Integer(5) != new Integer(5)
Integer.valueOf(5) == Integer.valueOf(5)
it может создавать Integer
объекты без необходимости.
Это также возможночто в какой-то момент в будущем (когда типы значений будут полностью реализованы) устаревшая форма может стать ошибочной в некоторых случаях.
Длязапомните, это то, что вы получите, если будете следовать советам из исходного предупреждения:
$ javac Genric.java
Genric.java:24: error: cannot find symbol
s2.getdata();
^
symbol: method getdata()
location: variable s2 of type Student<Integer>
Note: Genric.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
1 error
$ javac -Xlint:deprecation Genric.java
Genric.java:23: warning: [deprecation] Integer(int) in Integer has been deprecated
s2.SetData(new Integer(5));
^
Genric.java:24: error: cannot find symbol
s2.getdata();
^
symbol: method getdata()
location: variable s2 of type Student<Integer>
1 error
1 warning
$
Ошибка «не удается найти символ» связана с тем, что вы объявили метод как GetData
, а не getdata
.
Что подводит меня к последней точке. Стиль 1 :
Имена методов всегда должны начинаться со строчной буквы и должны быть "верблюжьим регистром". Например:
getData // correct
GetData // incorrect
getdata // incorrect
Общие имена параметров обычно представляют собой одну заглавную букву;
class Student<T> // correct
class Student<Type> // incorrect
Кроме того, Type
являетсянеправильный выбор, потому что в java.lang
есть класс Type
.
Важно правильное написание 2 , особенно в открытых именах классов и методов: Genric
должно быть Generic
.
Ваш код должен иметь одинаковый отступ. Желательно по 4 пробела (не символ табуляции) на уровень.
Будьте последовательны в отношении пробелов в строках:
s= "what the heck";
просто безобразно. Должен быть один пробел до и после каждого бинарного оператора.
1 - я заметил, что кто-то услужливо исправил множество ошибок стиля. Я имею в виду стиль кода, который вы изначально опубликовали;то есть то, что вы хотели, чтобы мы прочитали .
2 - Это действительно здорово - писать код против API с ошибочными именами. Большинство людей простят вас, если вы напишите «цвет» против «цвет» и другие случаи, когда есть альтернативные варианты написания. Но если вы не уверены, проверьте в словаре.