Java 在不知道具体类型的情况下实例化对象

Java 在不知道具体类型的情况下实例化对象,java,generics,design-patterns,Java,Generics,Design Patterns,我正在创建以下java类 class EntityCollection <E extends Entity, M extends Hashmap<?,E>> { } class EntityCollection由于类型擦除,无法按设置的方式执行此操作。你可以通过让他们把课程传给你来完成 请阅读: 创建hashmap很容易,您只需传递泛型类型,甚至使用菱形符号即可完成 M m = new HashMap<>(); M=newhashmap(); 复杂的是,

我正在创建以下java类

class EntityCollection <E extends Entity, M extends Hashmap<?,E>> {
}

class EntityCollection由于类型擦除,无法按设置的方式执行此操作。你可以通过让他们把课程传给你来完成

请阅读:


创建hashmap很容易,您只需传递泛型类型,甚至使用菱形符号即可完成

M m = new HashMap<>();
M=newhashmap();
复杂的是,您还希望能够选择贴图的类型。这可以通过多种方式实现:

  • 您可以使用Factory模式并传入一个Factory对象,该对象根据需要创建贴图

  • 您可以在类外部生成映射,并将其传递给构造函数

  • 使用抽象方法创建地图。当创建类的实例时,人们将实现该抽象方法并为其生成映射

对于第二个问题,如果没有更多关于你正在做什么的细节,就无法知道。这是一个体系结构决策,很可能不适合堆栈溢出问答。尽管这一切看起来有点混乱,但您公开了很多类的内部行为。您最好考虑更多您想要的行为和提供这些行为的接口,而不是实现的细节


例如,您可以拥有一个
枚举{UNSORTED,INSERTION_ORDER,etc}
,然后基于该枚举实例化正确的映射。

我认为OP希望能够动态构造调用方请求的
HashMap
的子类。也就是说,我可以要求他使用一个
LinkedHashMap
;工作?@Duncan你是对的当然,我错过了。我已经修改了我的答案。是的,正在创建集合,但属于用户在中指定的类型M@TimB我对“实例化m”的要求做出了反应。用户(不是entitycollection作者)创建的工厂也可以抽象出具体类型的知识,但简单的依赖项注入也可以。