Явный класс против обобщений на интерфейсе - PullRequest
0 голосов
/ 14 июня 2019

Давайте представим следующий случай:

Мы определяем пару классов VO:

abstract class A { // some class variables }

class B extends A { // more specific class variables }

Теперь, что было бы лучше при создании интерфейса и его реализации?

Предложение 1:

interface X {
    A method1();
}

class ImplX implements X {
    public A method1() {
        return new B();
    }
}

// more class implementations of the interface

Предложение 2:

interface X <T extends A> {
    T method1();
}

class ImplX implements X<B> {
    public B method1() {
        return new B();
    }
}

// more class implementations of the interface

Каковы преимущества и недостатки обеих реализаций? Какая лучшая практика?

1 Ответ

0 голосов
/ 14 июня 2019

Существует более простой способ вернуть B, который не требует использования обобщений:

class ImplX implements X {
    public B method1() {
        return new B();
    }
}

Вы можете использовать ковариантные типы возврата.

Смысл создания X универсального в том, что вам необходимо использовать универсальные везде . X<Foo>, X<Bar>, X<List<Map<String, Map<String, Integer>>>> .... даже если вы не хотите заботиться о том, что это такое, вам все равно придется использовать X<?>.

Если вам действительно не нужно знать, что B специально будет возвращен этим методом, оставьте его не универсальным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...