Подтвердить что ты не робот

Java, если тернарный оператор и Collections.emptyList()

Не могли бы вы объяснить, почему с первым типом возврата код не может быть скомпилирован? Сообщение: Type mismatch: cannot convert from List<capture#1-of ? extends Object> to List<String>.

Вставляется ли явное приведение во втором случае?

public class GenericsTest {

        private String getString() {
            return null;
        }

        public List<String> method() {
            String someVariable = getString();
            //first return type
            //return someVariable == null ? Collections.emptyList() : Collections.singletonList(someVariable);
            //second return type
            if (someVariable == null) {
                return Collections.emptyList();
            } else {
                return Collections.singletonList(someVariable);
            }
        }
    }
4b9b3361

Ответ 1

Из-за правил вывода типа. Я не знаю, почему именно (вы должны проверить JSL, раздел тернарного оператора), но, похоже, тройное выражение не выводит тип параметр из возвращаемого типа.

Другими словами, тип тройного выражения зависит от типов его операндов. Но один из операндов имеет неопределенный параметр типа (Collections.emptyList()). В этой точке тройное выражение все еще не имеет типа, поэтому оно не может влиять на параметр типа. Существует два типа, которые следует вывести - один из них является результатом тройного выражения, а другой является параметром типа метода .emptyList().

Используйте Collections.<String>emptyList(), чтобы явно установить тип

Ответ 2

Тип выражения flag ? trueCase : falseCase является наиболее распространенным типом двух случаев.

В этом случае наиболее распространенным типом Collections.emptyList() и Collections.singletonList(someVariable) является List<? extends Object>, потому что он не может "видеть в будущем", что Collections.emptyList() должен возвращать List<String> в выражении.


Когда вы выполните:

return Collections.emptyList();

компилятор может быть умным и обнаруживать тип по типу возврата и проверять правильность (вывод).

Ответ 3

Потому что Collections.emptyList() не возвращает List<String>. Вы устанавливаете явный результат метода List<String>, и это означает, что вы должны вернуть такой список.

Например

return Collection<String>.emptyList(); 

или

return new ArrayList<String>();

будет работать нормально.