java templating如何显式指定在已命名的类上使用参数变量?

时间:2013-07-25 23:36:05

标签: java generics

public abstract class InterruptableEvaluator<State> {
    public abstract evaluate(State state);
    public abstract haltEvaluation();

    private final class EvaluationThread extends Thread {
        private State state;

        public EvaluationThread(State state) {
            this.state = state;
        }

        @Override
        public void run() {
            evaluate(state);
            haltEvaluation();
        }
    }
}

问题在于:

        @Override
        public void run() {
            evaluate(state);
            haltEvaluation();
        }

对象state被视为java.lang.Thread.State对象,而不是使用InterruptableEvaluator中的参数。

如何明确告诉Java使用参数变量而不是java.lang.Thread.State

2 个答案:

答案 0 :(得分:6)

为了简洁起见,泛型通常包含单个字母用于类型参数,并且由于缺少使用单个字母命名的真正类。将State更改为S或任何其他有效的类型名称,该名称不是参数中的现有类/接口,并且在任何位置使用它都应该没问题。

答案 1 :(得分:1)

在不将代码库中的参数State更改为其他名称的情况下,我相信我找到了一个有效的解决方案:

public abstract class InterruptableEvaluator<State> {
    public abstract evaluate(State state);
    public abstract haltEvaluation();

    private final class EvaluationThread<S extends State> extends Thread {
        private S state;

        public EvaluationThread(S state) {
            this.state = state;
        }

        @Override
        public void run() {
            evaluate(state);
            haltEvaluation();
        }
    }
}

这样,评估线程中的变量仍然很明显是一个State对象,而StateS的变化对于这个类定义是本地的。这意味着在我的整个代码库中没有疯狂的重构,同时仍然在Statejava.lang.Thread.State之间消除歧义。

但是,如果Java提供了一种更容易避免此问题的方法,那就太好了。