По сути, это потому, что вывод типа в <>
не учитывает последующие методы, которые вы объединяете в цепочку.
Например, это создает ArrayList<Object>
:
new ArrayList<>().add("");
Если я вставлю слово String
в <>
, IntelliJ не будет жаловаться на то, что слово String
является избыточным.
Аналогично, это приводит к ошибке:
OuterClass<String>.InnerClass i = new OuterClass<>().inner(string);
Поскольку с правой стороны выводится OuterClass<Object>.Inner
, а с левой стороны - OuterClass<String>.InnerClass
.
Чтобы исправить это, необходимо указать параметр generi c:
new OuterClass<String>()
.inner(string)
.call(s -> s.length());
Что касается вашего редактирования, отредактированный метод inner
по-прежнему зависит от универсального c типа Outer
, который не может быть правильно выведен.
Вы можете сделать Inner
созданный объект не зависит от типа c generi Outer
путем добавления другого параметра c generi:
public <U> InnerClass<U> inner(U object) {
return new InnerClass<>(object);
}