【问题标题】:Java Generic extends subclass Incompatible typesJava Generic 扩展子类不兼容的类型
【发布时间】:2018-04-21 20:27:40
【问题描述】:

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

Java Generics and generic types

Java generics incompatible type

Java Generics Incompatible Types

Java generics: incompatible types

他们都没有解决我遇到的问题。以下代码有些做作,但说明了问题。我使用的是 Java 1.8。

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&lt;ACTION&gt;selectAction() 从一个List&lt;ACTION&gt; 返回一个ACTION,为什么@987654333 中会出现类型不兼容的错误@?

我该如何解决?

编辑

我想我已经解决了:

import java.util.List;

/**
 * Created by aaron on 11/8/2017.
 */
public abstract class Selecter<ACTION> {
    public abstract class State<A> {
        public abstract List<A> getActions();
        public abstract A selectAction(List<A> list, int selector);
    }

    public ACTION searchAction(State<ACTION> state, int selector) {
        return state.selectAction(state.getActions(), selector);
    }
}

但是,我不知道为什么这个有效而另一个无效。

【问题讨论】:

  • State.selectAction(state.getActions(), 选择器)
  • “不兼容的类型”是什么意思?请在此处发布相关错误消息。同时显示ACTION的定义
  • &lt;STATE extends Selecter&lt;STATE, ACTION&gt;.State, ACTION&gt; 让它编译,但这太荒谬了。请找到另一种方法来为您的用例建模,无论它是什么。
  • 错误是不兼容的类型:必需:找到的操作:Java.lang.Object
  • 在您的第一个版本中,您不能简单地使用State state,并完全删除STATE 类型变量吗?

标签: java generics abstract-class inner-classes


【解决方案1】:

您最初的尝试不起作用,因为您使用的是原始类型。

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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多