#java #dictionary #java-8 #stream #optional
#Ява #словарь #java-8 #течение #необязательный
Вопрос:
У меня была проблема с компилятором, которую я смог свести к этому примеру. Этот код
class Alt;Tgt; { Optionallt;Integergt; op; public Optionallt;Integergt; getOp() { return op; } } Listlt;Agt; l = null; l.stream().map(x -gt; x.getOp().orElse(0)).max(Comparator.naturalOrder());
не компилируется с
error: incompatible types: inference variable T has incompatible bounds [javac] l.stream().map(x -gt; x.getOp().orElse(0)).max(Comparator.naturalOrder()); [javac] ^
Если я удаляю универсальный параметр lt;Tgt;
(который вообще не используется в классе), то этот фрагмент компилируется. Что здесь происходит? Я использую Java 8.
Комментарии:
1. Не используйте необработанные типы.
Listlt;Agt;
имеет необработанный тип какA
универсальный. Необработанные типы и вывод типов не играют хорошо!2.Ввод необработанного типа
A
Listlt;Agt;
приводит к потере всей общей информации, включая тип возвращаемогоgetOp()
значения , даже если это не связаноT
. Кроме того,Optionallt;Integergt; getOp()
запахи, когда заключающий типAlt;Tgt;
. Разве это не должно быть как-то связано сOptionallt;Tgt;
этим ?3. А как насчет использования
Listlt;Alt;?gt;gt;
вместоListlt;Agt;
?4. Это просто пример, когда у универсального метода есть метод, не зависящий от параметра универсального типа. Реальный пример выглядит так
class A implements Iterablelt;Bgt;
: гдеB
находится универсальный интерфейс. ПоэтомуA
в объявлении в качестве параметра типа используется «необработанный интерфейс». Я почитаю об этом. Спасибо!5. Это не одно и то же.
A
является необработанным типом иAlt;?gt;
универсальным типом с подстановочными знаками. Похоже, что проблема заключалась в необработанном типе.