java - 泛型在 Java 中被忽略

标签 java generics

所以我有这段 Java 代码:

public <A extends Action> List<A> getActionsFor(Actor a) {
    List<A> theActions = super.getActionsFor(a);

    for (Action ac: a.getItemCarried().getActions()) {
        theActions.add(ac);
    }

    return theActions;
}

出于某种原因,javac 拒绝 .add(ac) 声称 add(A) 不能应用于 Action。

我是不是漏掉了一些关键的东西?我可以通过在两个包之间创建依赖关系来解决这个问题,但我真的不想这样做。

所有有问题的类都已正确导入,并且调用的每个方法都有效,所以我真的不知道为什么它不能接受 A 扩展的类类型。

任何建议,即使您不确定也将不胜感激,因为我必须在接下来的 6 小时内修复此问题,否则我将需要创建该依赖项。

最佳答案

Am I missing something key here?

A 是对 Action 的扩展,ac 也是对 Action 的扩展。不过这有点像设施

Yesterday I saw someone.
Someone is the President
Therefor, yesterday I was the President.

问题是编译器不知道 AActionAction 的兼容子类

一个简单的解决方法是不要那么具体。在此方法中使用 Action 而不是 A

public List<Action> getActionsFor(Actor a) {
    // this has to return a copy of the List or you will be modifying an original
    List<Action> theActions = super.getActionsFor(a);

    for (Action ac: a.getItemCarried().getActions()) {
        theActions.add(ac); // ac is an Action so all good.
    }

    return theActions;
}

或者你可以做你拥有的,但更复杂

public <A extends Action> List<A> getActionsFor(Actor<A> a) {
    List<A> theActions = super.getActionsFor(a);

    for (A ac: a.getItemCarried().getActions()) {
        theActions.add(ac); // ac is an A, so all good.
    }

    return theActions;
}

关于java - 泛型在 Java 中被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23423226/

相关文章:

Java泛型类型删除

java - 用于实现通用接口(interface)的 2 个以上类的高级 Java 习惯用法

java - 比较同一个List Java中的元素

java - Hibernate 不会加载一对多的关系集,即使使用 eager fetch

java - 设置操作栏标题颜色时不推荐使用 Html.fromHtml

delphi - 如何在 Delphi 中的泛型方法中完全限定类型标识符?

java - 带有 Kotlin 的 Dagger 2,在 ApplicationComponent 中返回具有泛型的类型

java - 使用可变参数和泛型时出现 ClassCastException

java - 在没有监听器的情况下获取鼠标位置

java - Android - 时间不更新