Java Generic扩展了子类不兼容的类型

时间:2017-11-08 23:59:07

标签: java generics abstract-class inner-classes

首先,我看了很多以前的帖子,包括:

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>

但是,我不知道为什么会这样,而另一个则不然。

1 个答案:

答案 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>

但这非常混乱。

StateSelecter的内部类,因此它继承了它的类型变量。就这样:

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