Дженерики
public abstract class Arguments<T> {
public List<T> execute() {
// some stuff
return new ArrayList<T>();
}
}
public class ItemArguments extends Arguments<Item> {
}
Вам даже не нужно создавать подклассы, если у вас нет других причин для этого
public class Arguments<T> {
public List<T> execute() {
// blah
}
}
Arguments<Item> o1 = new Arguments<Item>();
List<Item> o2 = o1.execute();
Вызов методов на T не так прост. T стирается компилятором и поэтому недоступен во время выполнения. Легкий для понимания обходной путь - переходить в класс при создании экземпляра Arguments
public class Foo {
public static void something() { ... }
}
public class Arguments<T extends Foo> {
private Class<? extends Foo> foo;
public Arguments(Class<? extends Foo> foo) {
this.foo = foo;
}
public List<T> execute() {
foo.something();
}
}
Есть лучшие способы, но это в основном понятно, не будучи мастером шаблонов:)