Допустим, у меня есть два интерфейса, Foo и Bar:
interface Foo<T extends Bar<U>, U> {
T getBar();
default U get() {
return getBar().get();
}
}
interface Bar<U> {
U get();
}
Реализации должны выглядеть следующим образом:
class BarImpl implements Bar<String> {
@Override
String get() {
return "bar";
}
}
class FooImpl implements Foo<BarImpl, String> { // Specifying String here is redundant, we know that BarImpl implements Bar<String>
@Override
public BarImpl getBar() {
return new BarImpl();
}
}
В идеале, Foo
можно определить только с помощьюОдин указанный параметр типа (T
) и U
могут быть выведены, поэтому объявление FooImpl может быть просто class FooImpl implements Foo<BarImpl>
.Однако на этом этапе, чтобы мы могли использовать U
в интерфейсе Foo
, нам требуется дополнительный параметр.Есть ли способ обойти это?