Скажем, у меня есть этот интерфейс (который НЕ параметризуется)
public interface MyInterface
{
MyInterface copy();
}
Как я могу убедиться, что любая реализация copy
вернет фактический подтип (а не MyInterface
).
Например.,
public Impl implements MyInterface
{
@Override
public Impl copy() <<<<< The returns type of this needs to be 'Impl'
{
return new Impl();
}
}
Но я не могу предотвратить любую реализацию:
public Foo implements MyInterface
{
@Override
public MyInterface copy() <<<<< The returns type of this needs to be 'Foo'
{
return new Impl();
}
}
Вы можете указать общий тип, который является подклассом интерфейса:
interface MyInterface<T extends MyInterface<T>> {
T copy();
}
class Foo implements MyInterface<Foo> {
public Foo copy() {
return null;
}
}
MyInterface
потому что он ничего не значит, когда помещается в контекст.
T extends MyInterface
Скажем, у меня есть этот интерфейс (который НЕ параметризуется)
Если вы хотите сохранить его непараметрированным, нет решения, которое удовлетворит оба ваших примера. И я не понимаю, почему вы хотите, если вы программируете на интерфейсы и не контролируете реализации вашего интерфейса.