想象一下,我有一种关系,比如“狗生活在陆地上,鱼生活在水中,青蛙生活在水和土地上”。因此,这种关系是动物及其相关的生活环境。所以,我有自己的狗类,鱼类,以及其他任何动物。我也有自己的陆地类,水类和两个类,所有这些都扩展了抽象类Environment。
假设我想将每个环境类型与描述相关联,因此我创建了一个HashMap。
但是,当我执行代码时,我希望HashMap是HashMap<“Environment的一些子类”,String>。
现在,让我们说我们有一个对象,它是一种类型的狗,青蛙或任何类型的动物。我希望能够说:HashMap<Environment, String> = new HashMap<a.getAssociatedEnvironment(), String>;
如何编写此getAssociatedEnvironment()方法?我真的可以这样做:
public Class<T> getAssociatedEnvironment(Animal a) {
if(a instanceof Dog)
return Dog.class
if(a instanceof Frog)
return Frog.class
. . .
}
答案 0 :(得分:1)
您无法动态创建类型参数 在运行时,您甚至没有任何关于泛型类型的实际类型信息 它是一种纯编译时类型检查,可以向后兼容。
您可能想要使用
HashMap<? extends Environment, String> h = new HashMap<>;
或
HashMap<? super Environment, String> h = new HashMap<>;
取决于您是否要将内容添加到地图中。如果您需要更深入地了解泛型,请阅读更多有关泛型的信息。 : - )
除此之外,您可能希望Land
和Water
代替LandAnimal
和WaterAnimal
接口,然后Dog
实施LandAnimal
, Fish
实施WaterAnimal
和Frog
同时实施。