Как поместить все классы в один общий тип класса? - PullRequest
1 голос
/ 01 марта 2012

У меня есть n классов java, каждый из которых содержит свой набор переменных.У меня есть метод, который должен принять один из этих n классов в качестве параметра, основанного на некоторых условиях.Как я могу сделать все эти классы подклассами для универсального типа, чтобы моя сигнатура метода принимала все эти разные типы?Я не хочу перегружать метод.И если использовать параметр «Object» для параметра, я теряю природу класса входного параметра, который я передаю.

Ответы [ 4 ]

3 голосов
/ 01 марта 2012

Определите интерфейс, который реализуют все ваши классы.Затем объявите ваш параметр в заголовке метода как тип этого интерфейса.

2 голосов
/ 01 марта 2012

Это то, что вы хотите?

public interface common<T extends common<?>> {
    public void commonMethod(T param, ...);
}

public class child implements common<child> {
    public void commonMethod(child param, ...) {
        ...
    }
}
1 голос
/ 01 марта 2012

Если вы не можете использовать полиморфизм (как предложено другими), то вы можете использовать для этого общие средства Java:

например. это может быть использовано для помещения любого объекта в кеш:

public <T> void doSomethingWithObject(final T object) {
    ...
}

И вы можете назвать это так: например, используя строку

yourInstance.<String> doSomethingWithObject(object);
1 голос
/ 01 марта 2012

Как я могу сделать все эти классы подклассами общего типа, чтобы моя сигнатура метода принимала все эти различные типы?

Просто создайте абстрактный класс, MySuperClass, этот класс наследуется всеми классами, которые вы хотите передать в метод. Этот суперкласс обладает общими функциями и атрибутами.

Другой способ, если ваши подклассы могут расширять другой класс; или среди класса нет ничего общего (кроме того факта, что все они передаются в ваш метод), вы можете иметь интерфейс, скажем MySuperClass (в идеале, мне нравится интерфейс, начинающийся с I, например IMySuperClass ).

Я не хочу перегружать метод.

Когда у вас есть готовый суперкласс или интерфейс, сигнатура вашего метода будет выглядеть примерно так: myMethod(Param1 val1, MySuperClass myObj, Param3 val3).

Simple.

...