И проблема в том, что я не понимаю, почему я могу назначить List, если перейду к методу doSomething необработанный тип (который в моем случае представляет собой просто необработанный HashMap), по какой-то причине выглядит так, как будто необработанный тип на входе влияет на необработанный тип на выходе.
Код: Выделить всё
class Someclass{
interface A{
}
static class B implements A{}
static List doSomething(Map param) {
return List.of(new B());
}
public static void test() {
List bs = doSomething(null);
List list = doSomething(new HashMap());//compiles, but with warnings
List list2 = doSomething(new HashMap());//does not compile
}
}
Я получаю эту ошибку:
несовместимые типы: java.util.List невозможно преобразовать в
java.util.List
Но проблема в том, что в этом коде компилируется одна строка, я написал об этом комментарий в самом коде. Но метод возвращает тот же тип, и в качестве типа переменной существует тот же тип List, что и в последней строке, который не компилируется. Почему вторая строка в тесте метода не выдает ту же ошибку?
Может ли кто-нибудь объяснить, это ожидаемое поведение или это ошибка?
Это ошибка? есть ли что-нибудь в спецификации языка Java по этому поводу?
Кстати, я использую Java 17. Я не уверен, что эта проблема зависит от поставщика JDK
Это дало мне одинаковый результат на разных машинах, где используются разные поставщики jdk, я не пробовал все из них, я пробовал не более двух разных поставщиков, openjdk 17 ( который по умолчанию находится в репозитории Debian) и принять openjdk.
Подробнее здесь: https://stackoverflow.com/questions/793 ... urn-result