在通用方法的实现中强制实现类型安全

时间:2012-11-21 08:40:05

标签: java generics abstract-class

假设我有这个通用类,它可以完成一些工作并产生结果:

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

2 个答案:

答案 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();   
}
相关问题