универсальный в интерфейсе в Java

1

Скажем, у меня есть этот интерфейс (который НЕ параметризуется)

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();
    }
}
  • 1
    Вам не нужно беспокоиться о ссылке типа возврата. Это фактический объект, который будет делать все в соответствии с полиморфизмом .
  • 0
    В коде вызова вы можете преобразовать возвращаемое значение из Foo.copy () в Foo, но вы должны быть уверены, что сначала вы вызываете copy для Foo.
Теги:
generics
interface

2 ответа

4

Вы можете указать общий тип, который является подклассом интерфейса:

interface MyInterface<T extends MyInterface<T>> {
    T copy();
}


class Foo implements MyInterface<Foo> {
    public Foo copy() {
        return null;
    }
}
  • 0
    Я не хочу параметризировать мой MyInterface потому что он ничего не значит, когда помещается в контекст.
  • 0
    Не игнорируйте предупреждения MyInterface является необработанным типом. Ссылки на универсальный тип MyInterface <T> должны быть параметризованы. Это не универсальный внутри T extends MyInterface
0

Скажем, у меня есть этот интерфейс (который НЕ параметризуется)

Если вы хотите сохранить его непараметрированным, нет решения, которое удовлетворит оба ваших примера. И я не понимаю, почему вы хотите, если вы программируете на интерфейсы и не контролируете реализации вашего интерфейса.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню