0
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对象,而不是使用参数 from InterruptableEvaluator

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

4

2 回答 2

6

为简洁起见,泛型通常包含用于类型参数的单个字母,并且由于缺少以单个字母命名的真实类。更改StateS参数中的现有类/接口以及使用它的任何地方都不是现有类/接口的任何其他有效类型名称,您应该没问题。

于 2013-07-25T23:37:38.737 回答
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 对象,并且从Stateto的更改S对于这一类定义来说是本地的,这一点仍然非常明显。这意味着在我的整个代码库中没有疯狂的重构狂潮,同时仍然消除和之间的State歧义java.lang.Thread.State

但是,如果 Java 提供了一种更简单的方法来避免这个问题,那就太好了。

于 2013-07-26T00:04:48.370 回答