Компилятор Java определит, может ли тип переменной удовлетворить общий тип возвращаемого значения вызываемого метода. С таким классом, как FileInputStream
, он знает, что ни один класс не может быть как FileInputStream
, так и String
, потому что класс не может наследоваться от более чем одного класса, поэтому это запрещено. Кроме того, мы знаем, что String
также final
, но это не входит в логику компилятора.
Однако с интерфейсом для подкласса возможно расширить границы и быть подклассом другого класса.
class Thing extends FileInputStream implements Predicate<String> {
// Implementation
}
По этой причине это компилируется.
Thing works = getBoundedByInterface();
Обратите внимание, что он также работает с String
, поскольку компилятор не учитывает, что String
равно final
.