首先,我看了很多以前的帖子,包括:
Java Generics and generic types
Java generics incompatible type
Java Generics Incompatible Types
Java generics: incompatible types
他们都没有解决我遇到的问题。以下代码有点人为,但说明了问题。我正在使用Java 1.8。
95933
现在,由于import java.util.List;
/**
* Created by aaron on 11/8/2017.
*/
public abstract class Selecter<STATE extends Selecter.State, ACTION> {
public abstract class State {
public abstract List<ACTION> getActions();
public abstract ACTION selectAction(List<ACTION> list, int selector);
}
public ACTION searchAction(STATE state, int selector) {
return state.selectAction(state.getActions(), selector);
}
}
必须是STATE
,而Selector.State
返回getActions()
而List<ACTION>
会从{{{0}返回selectAction()
1}},为什么ACTION
中存在不兼容的类型错误?
我该如何解决?
修改的
我想我已经解决了这个问题:
List<ACTION>
但是,我不知道为什么会这样,而另一个则不然。
答案 0 :(得分:0)
您的原始尝试无效,因为您正在使用原始类型。
class Selecter<STATE extends Selecter.State, ACTION>
^ Selecter is generic, missing type variables.
因此,如果您尝试使用STATE
,则会删除泛型。所以在:
public ACTION searchAction(STATE state, int selector) {
return state.selectAction(state.getActions(), selector);
}
返回值的类型为Object
,而不是ACTION
,因为它是ACTION
的上限。
您可以按照Sotirios的建议添加类型变量:
class Selecter<STATE extends Selecter<STATE, ACTION>.State, ACTION>
但这非常混乱。
State
是Selecter
的内部类,因此它继承了它的类型变量。就这样:
public abstract class Selecter<ACTION> {
public abstract class State {
public abstract List<ACTION> getActions();
public abstract ACTION selectAction(List<ACTION> list, int selector);
}
public ACTION searchAction(State state, int selector) {
return state.selectAction(state.getActions(), selector);
}
}
似乎是最简单的解决方案。 This compiles fine