Как исправить черный экран при встраивании в рабочий стол для macOS?

Что такое типы raw в Java и почему я часто слышу, что они не должны использоваться в новом коде?

blockquote>

Необработанные типы - это древняя история Java язык. В начале были Collections, и они больше не держали Objects и не меньше. Каждая операция на Collections требовала отличных от Object желаемого типа.

List aList = new ArrayList();
String s = "Hello World!";
aList.add(s);
String c = (String)aList.get(0);

Хотя это продолжалось большую часть времени, произошли ошибки

List aNumberList = new ArrayList();
String one = "1";//Number one
aNumberList.add(one);
Integer iOne = (Integer)aNumberList.get(0);//Insert ClassCastException here

Старый нетривиальные коллекции не могли обеспечить безопасность типов, поэтому программисту приходилось запоминать то, что он хранил в коллекции. Генераторы, изобретенные, чтобы обойти это ограничение, разработчик объявит сохраненный тип один раз, и компилятор сделает это вместо этого.

List aNumberList = new ArrayList();
aNumberList.add("one");
Integer iOne = aNumberList.get(0);//Compile time error
String sOne = aNumberList.get(0);//works fine

Для сравнения:

// Old style collections now known as raw types
List aList = new ArrayList(); //Could contain anything
// New style collections with Generics
List aList = new ArrayList(); //Contains only Strings

Более сложный Интерфейс Compareable:

//raw, not type save can compare with Other classes
class MyCompareAble implements CompareAble
{
   int id;
   public int compareTo(Object other)
   {return this.id - ((MyCompareAble)other).id;}
}
//Generic
class MyCompareAble implements CompareAble
{
   int id;
   public int compareTo(MyCompareAble other)
   {return this.id - other.id;}
}

Обратите внимание, что невозможно реализовать интерфейс CompareAble с compareTo(MyCompareAble) с необработанными типами. Почему вы не должны их использовать:

  • Любое Object, хранящееся в Collection, должно быть выполнено до его использования
  • Использование обобщений позволяет проверять время компиляции
  • Использование исходных типов - это то же самое, что и сохранение каждого значения как Object

Что делает компилятор: Дженерики обратно совместимы, они используют одни и те же классы java, типы делают.

List someStrings = new ArrayList();
someStrings.add("one");
String one = someStrings.get(0);

Будет скомпилирован как:

List someStrings = new ArrayList();
someStrings.add("one"); 
String one = (String)someStrings.get(0);

Это тот же код, который вы бы написали, если вы использовали исходные типы напрямую. Думаю, я не уверен, что происходит с интерфейсом CompareAble, я предполагаю, что он создает две функции compareTo, одна из которых принимает MyCompareAble, а другая принимает Object и передает ее первой после ее литья.

Каковы альтернативы сырым типам: используйте generics

0
задан Hooshyar 24 March 2019 в 06:37
поделиться