下面的演员阵容是否可以避免?
//Is there a way this can be implemented so the cast is not necessary?
FooService fooService = new FooService();
Foo f = (Foo)fooService.findById(id);
public class FooService extends DomainServiceImpl<Foo> {
}
public class DomainService<T extends Persistable>{
private Class<T> type;
public void findById(long id) {
domainDao.findById(id, type);
}
}
编辑:仍然需要施放
public T findById(long id) {
return (T) fooDao.findById(id, type);
}
答案 0 :(得分:1)
嗯,在此之前我会发布一个可能符合您需求的解决方案。但是,您必须根据具体问题进行调整。
主要思想是,方法findById
返回泛型类型T
,因此您不需要在代码中使用类型转换。
class Solution {
static class Foo extends Persistable {
}
public static void main(String[] args) {
FooService fooService = new FooService();
Foo f = fooService.findById(0l);
}
static class FooService extends DomainService<Foo> {
FooService() {
type = Foo.class;
}
}
static class Persistable {
}
static class DomainService<T extends Persistable> {
Class<T> type;
public T findById(long id) {
try {
return this.type.newInstance();
}
catch (InstantiationException e) {
throw new RuntimeException(e);
}
catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
}
答案 1 :(得分:0)
您可以使用:
type.cast(object);
避免警告。
请注意,这仍然可能抛出ClassCastException。
如果您不确定该对象是否可以投射,请查看:
if (type.isInstance(object)){
return type.cast(object);
} else {
...
}