Cyr*_* N. 0 java inheritance types
我有两节课:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,ItemArguments中的execute方法有点无用,但如果没有它,我必须将所有调用转换为Arguments中的execute方法.
有没有办法删除ItemArguments中的execute方法,并避免在进行调用的地方进行强制转换?
谢谢你的帮助!
pto*_*mli 10
泛型
public abstract class Arguments<T> {
public List<T> execute() {
// some stuff
return new ArrayList<T>();
}
}
public class ItemArguments extends Arguments<Item> {
}
Run Code Online (Sandbox Code Playgroud)
除非有其他原因,否则您甚至不需要子类
public class Arguments<T> {
public List<T> execute() {
// blah
}
}
Arguments<Item> o1 = new Arguments<Item>();
List<Item> o2 = o1.execute();
Run Code Online (Sandbox Code Playgroud)
在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();
}
}
Run Code Online (Sandbox Code Playgroud)
有更好的方法,但这绝对是可以理解的,而不是模式大师:)
| 归档时间: |
|
| 查看次数: |
196 次 |
| 最近记录: |