我有两个班级:
public abstract class Arguments {
public List execute() {
// do some stuff and return a list
}
}
// and a child :
public class ItemArguments {
public List<Item> execute() {
return super.execute();
}
}
正如您所看到的,ItemArguments中的execute方法有点无用,但如果没有它,我必须将所有调用转换为Arguments中的execute方法。
有没有办法删除ItemArguments中的execute方法,并避免在进行调用的地方进行强制转换?
感谢您的帮助!
答案 0 :(得分:10)
泛型
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();
}
}
有更好的方法,但如果不是模式大师,这几乎是可以理解的:)