Если вы хотите, чтобы вызывающий абонент знал , что он получает LinkedList
или ArrayList
, тогда вы можете использовать дженерики.
Это будет выглядеть примерно так:
public abstract class A<T extends List<String>> {
public abstract T method()
}
public class B extends A<ArrayList<String>> {
public ArrayList<String> method() {
//...
}
}
public class C extends A<LinkedList<String>> {
public LinkedList<String> method() {
//...
}
}
Или, если вы собираетесь взаимодействовать с B
и C
напрямую (не через A
), то вы можете использовать ковариантные типы возврата и просто сделать, чтобы подклассы объявляли тип возврата как ArrayList
и LinkedList
соответственно.В Java 5+ допустимо сужать тип возвращаемого значения переопределенного метода.
Если конкретный тип не должен быть известен вызывающей стороне, то вы просто хотите передать стратегию (то есть фабрику)) для создания списка на A
.Это можно сделать, реализовав простой интерфейс:
public interface ListFactory<T> {
public List<T> newList();
}
и затем передав его в конструктор A
.Фактически фабрика может использоваться в любом случае, однако вам нужны только классы B
и C
, если вы находитесь в первой описанной мной ситуации.