假设我有这个通用类,它可以完成一些工作并产生结果:
public abstract class Work<T> {
private T mResult;
public Work(T result) {
mResult = result;
}
public abstract <T> void doWork(T result);
public T getResult() {
return mResult;
}
}
对于这个类的用户,我希望类型安全看起来像这样:
Work<MyResult> work = new Work<MyResult>(new MyResult()){
public void work(MyResult result){
//...
}
}
问题是Java不能以这种方式工作并迫使我从泛型类型转换:
Work<MyResult> work = new Work<MyResult>(new MyResult()){
public <T> void work (T result){
// (MyResult)result - not nice
}
}
有没有办法像第一个例子那样以一种很好的方式获得类型安全?
谢谢, TEO
答案 0 :(得分:4)
您在<T>
的声明中不需要doWork
,因为您想要使用在类级别声明的T - 您需要
public abstract void doWork(T result);
当前声明与
相同public abstract <A> void doWork(A result);
它不一定和你班上的其他人一样。
答案 1 :(得分:0)
请改为尝试:
Work<MyResult> work = new Work<MyResult>(new MyResult()){
public void work(MyResult result){
// Do something
}
}
您Work
课程的当前设计有点奇怪。我不确定为什么你的doWork
方法需要一个结果对象作为参数。抽象类似乎也提供了很少的功能(虽然我很欣赏这可能是一个原型)。也许考虑一个界面:
public interface Work<T> {
public T doWork();
}