Подтвердить что ты не робот

Общий метод, который принимает только часть классов

Предположим, что у меня есть следующая структура класса:

class Base {}
class A extends Base {}
class B extends Base {}
class C extends Base {}

Я хочу написать метод, который принимает экземпляры A и B, но не экземпляры C.
Могу ли я достичь этого на Java?

Я знаю, что это не хорошая ситуация наследования (у A и B должен быть общий родитель, отличный от C), но мне любопытно только в Java-способе справиться с такой ситуацией.

EDIT:
!!!
Я знаю, что лучшее наследование решит проблему. Мне просто любопытно, если у Java есть стандартный механизм для решения такой проблемы.
!!!

4b9b3361

Ответ 1

Я думаю, ответ на ваши вопросы: "Нет, у java нет стандартного способа справиться с такой проблемой". И если у вас есть эта проблема, вы можете посмотреть другие ответы здесь, например, зафиксировать наследование или использовать умную технику данную MrSmith42.

Ответ 2

Используйте interface и используйте только A и B.

Ответ 3

Можете ли вы использовать интерфейс? например.

class Base {}
interface MyGenericInterface {}
class A extends Base implements MyGenericInterface {}
class B extends Base implements MyGenericInterface {}
class C extends Base {}

Таким образом, метод может принимать реализации MyGenericInterface, и поскольку A и B реализуют интерфейс, но C не поддерживает, он будет принимать экземпляры A и B, но не C, по мере необходимости.

Ответ 4

Если что-то должно принимать A, B, но не C, тогда вы должны пересмотреть, почему C наследует от Base в первую очередь. Вы можете добавить дополнительный слой наследования:

   ---Base---
   |        |
--Sub--     C
|     |
A     B

Тогда вы можете позволить вашему методу принимать объекты типа Sub. Sub даже не нужно ничего делать, и все они, технически, также Base.

Более быстрое решение было бы грязным if( arg.instanceof(C) ), хотя...

Ответ 5

Вы можете обрабатывать его во время выполнения, используя исключение:

void genericMethod(Base arg_in)
{
    if(arg_in instanceof C)
    {
        throw IllegalArgumentException("C class not accepted."); 
    }

    ...
    ...
}

Ответ 6

Иерархия типов не должна изменяться только потому, что вы хотите иметь такой метод. Но случай, когда вы хотите иметь такой метод, может указывать на то, что вы должны подумать над своим типа иерархии.

Но если вы уверены, что ваши типы хорошо разработаны, как насчет этого подхода:

    public class T {

        public void doSomething(final A a) {
            doSomthing(a);
        }

        public void doSomething(final B b) {
            doSomthing(b);
        }

        private void doSomthing(final Base b) {

            // Here is the implementation

        }

    }

Ответ 7

Вы можете использовать instanceof, чтобы проверить, имеет ли объект определенный тип.

Лучшая идея - лучшая структура наследования, конечно.

Ответ 8

Общие для безопасности типов. Период. Не "разрешать" или "запрещать" произвольные вещи. Нет причин для безопасности типа A и B, а не C.