классы Java не работают? <Integer>с учетом - PullRequest
0 голосов
/ 03 октября 2019

Я не могу создать общий класс с Integer. Он работает с String, но когда дело доходит до Integer, он говорит, что Java устарела, поскольку API переопределяется. Что я могу сделать для универсальных Integer типов?

class Student<Type> {

    private Type t;

    public void SetData(Type t) {
        this.t = t;
    }

    public void GetData() {
        System.out.println(t);
    }
}

public static void main(String[] args) {
    Student<String> s1 = new Student<String>();
    Student<Integer> s2 = new Student<Integer>();
    String s;

    s= "what the hell";
    s1.SetData(s);
    s1.GetData();
    s2.SetData(new Integer(5));
    s2.getdata();   
}

1 Ответ

4 голосов
/ 03 октября 2019

Это не проблема с генериками 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 :

  1. Имена методов всегда должны начинаться со строчной буквы и должны быть "верблюжьим регистром". Например:

      getData // correct
      GetData // incorrect
      getdata // incorrect
    
  2. Общие имена параметров обычно представляют собой одну заглавную букву;

      class Student<T>     // correct
      class Student<Type>  // incorrect
    
  3. Кроме того, Type являетсянеправильный выбор, потому что в java.lang есть класс Type.

  4. Важно правильное написание 2 , особенно в открытых именах классов и методов: Genricдолжно быть Generic.

  5. Ваш код должен иметь одинаковый отступ. Желательно по 4 пробела (не символ табуляции) на уровень.

  6. Будьте последовательны в отношении пробелов в строках:

        s= "what the heck";
    

    просто безобразно. Должен быть один пробел до и после каждого бинарного оператора.

1 - я заметил, что кто-то услужливо исправил множество ошибок стиля. Я имею в виду стиль кода, который вы изначально опубликовали;то есть то, что вы хотели, чтобы мы прочитали .

2 - Это действительно здорово - писать код против API с ошибочными именами. Большинство людей простят вас, если вы напишите «цвет» против «цвет» и другие случаи, когда есть альтернативные варианты написания. Но если вы не уверены, проверьте в словаре.

...