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
?
答案 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对象,而State
到S
的变化对于这个类定义是本地的。这意味着在我的整个代码库中没有疯狂的重构,同时仍然在State
和java.lang.Thread.State
之间消除歧义。
但是,如果Java提供了一种更容易避免此问题的方法,那就太好了。