Java, если троичный оператор и Collections.emptyList () - PullRequest
12 голосов
/ 12 октября 2011

Не могли бы вы объяснить, почему с первым типом возврата код не может быть скомпилирован?Сообщение: 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);
            }
        }
    }

Ответы [ 3 ]

18 голосов
/ 12 октября 2011

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

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

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

2 голосов
/ 12 октября 2011

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

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


Когда вы делаете:

return Collections.emptyList();

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

0 голосов
/ 12 октября 2011

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

Например

return Collection<String>.emptyList(); 

или

return new ArrayList<String>();

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...