В основном это о возможностях компилятора.Другими словами: в некоторой степени «количество» возможного вывода типа является деталью реализации.
В Java 7 иногда требуется использовать помощники типов / подсказки / свидетели, куда бы вы ни пошли Collections.<String>emptyList()
сообщить компилятору об этой недостающей части.
Более поздние реализации компилятора улучшили ситуацию, с которой вы почти всегда можете пойти с Collections.emptyList()
.
Относительно The compiler requires a value for the type argument T so it starts with the value Object.
... то естьна самом деле довольно просто: компилятор Java должен реализовать алгоритм, который, в конечном итоге, выводит определенный тип.Предоставляя некоторый псевдокод, который может выглядеть следующим образом:
Class<?> inferType(SomeSyntaxTree construct) {
Я просто использую Class
здесь, чтобы указать, что алгоритм вернет что-то, что напоминает известный тип.Теперь этот метод может быть реализован следующим образом:
Class<?> inferedType = Object.class
while (whatever) {
refine inferedType
}
return inferedType
Другими словами: это очень распространенный подход, когда вы «ищете» какое-то значение: вы инициализируете «наиболее"универсальное значение" (в системе типов Java это будет Object.class), и затем вы увидите, можно ли уточнить это универсальное значение, применяя какой-либо алгоритм.
В нашем случае уточнение может привести к тому, что «наиболее конкретный тип, который можно использовать - это String
», но если дальнейшее уточнение невозможно, то вы получите «исходное значение по умолчанию»., будучи Object
.