java - 访问存储在 Map 中的 Java 泛型

标签 java generics

我正在尝试访问存储在 map 中的自定义 Java 泛型,如下所示。
不幸的是,我遇到了类型不匹配错误。
现在,我可以将其转换为我想要的类型,因为但这对我来说似乎很困惑。
有没有一种干净的方法来完成作业?
谢谢

public interface BusinessObject {
}

public class SalesItemA implements BusinessObject {
}

public interface BusinessRuleSuite<T extends BusinessObject> {
    public void fire(T shell);
}

public abstract class BusinessRuleSuiteCommon<T extends BusinessObject>
    implements BusinessRuleSuite<T> {
        public synchronized void fire(T bo) {
            // do something with bo;
        }
    }


    public class SalesBusinessRuleSuite extends
        BusinessRuleSuiteCommon<SalesItemA> {
    }


    public class SalesProcessor {

        private final Map<Class<? extends BusinessObject>, BusinessRuleSuite<? extends BusinessObject>> businessRules;

        public SalesProcessor(Map<Class<? extends BusinessObject>, BusinessRuleSuite<? extends BusinessObject>> businessRules) {
            this.businessRules = businessRules;
        }


        public void processItem(SalesItemA sia) {
            /// This assignment doesn't work??? Why?
            BusinessRuleSuite<SalesItemA> p = this.businessRules.get(sia.getClass());
            p.fire(sia);
        }
    }
}

最佳答案

因为get()的返回类型是 BusinessRuleSuite<? extends BusinessObject> .

这意味着它将接受任何继承自 BusinessObject 的东西在put()期间.但是当你在赋值语句的右边使用它时,Java 就不能做假设了。它必须安全起见,所以 get()表现得就像你使用了 BusinessRuleSuite<BusinessObject> (没有 extends )。

有两种方法可以实现你想要的:

  1. 使用 BusinessRuleSuite<SalesItemA>在 map 声明中

  2. 使用强制转换

关于java - 访问存储在 Map 中的 Java 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1300841/

相关文章:

java - 无法在 anchor 元素上执行 Enter 键

java - 能解释一下 "Loggers are stored in a namespace hierarchy "是什么意思吗?

c# - 从 Generics<T> 转换为特定子类

Java - 列表、类型和继承(也许是通用的?)

java - Spring JPA审计空createdBy

java - 在maven插件中获取mojo参数

java - 更新 jar 中的类,指定目录?

java - 创建未知对象的集合

java - 如何实例化泛型类并调用方法

java - Collection 类中的 toArray() 方法