Java 使用泛型的Hashmap的getter setter
我有以下两门课 动物类Java 使用泛型的Hashmap的getter setter,java,generics,Java,Generics,我有以下两门课 动物类 class Animal { Map<String, A> data = new HashMap <String, A>(); public void setValue(HashMap<String, ?> val) { this.data = val; } public Map getValue() { return this.data; } } 在动物类文件中: Multi
class Animal {
Map<String, A> data = new HashMap <String, A>();
public void setValue(HashMap<String, ?> val)
{
this.data = val;
}
public Map getValue()
{
return this.data;
}
}
在动物类文件中:
Multiple markers at this line
- A cannot be resolved to a type
- A cannot be resolved to a type
- Incorrect number of arguments for type Map<K,V>; it cannot be parameterized with arguments
<HashMap<String,A>>
此行有多个标记
-无法将解析为类型
-无法将解析为类型
-类型映射的参数数目不正确;不能使用参数对其进行参数化
HashMap中键的数据类型总是字符串,但值的数据类型是随机的,因此我尝试使用泛型
来自PHP背景的我仍然无法掌握Java泛型的概念。你能告诉我代码中的错误在哪里吗
A cannot be resolved to a type
这仅仅意味着您使用的是不存在的类“A”。例如,这里Map data
您在说,您正在创建Map,其中string是键,值是type“A”
相比之下,这个Map
意味着您创建了Map,它的键是字符串,键的关联值是整数。您不应该为此使用Map
;这不像PHP
相反,您应该创建一个知道其每个字段类型的类:
class Animal {
String name;
String favfood;
int someIntegerField;
List<Foo> someListField;
...
}
类动物{
字符串名;
串珠;
整数域;
列表字段;
...
}
只有当所有键和值都具有相同的类型时,才应该真正使用Map
。您的Map
在其声明中具有未定义的类型a
。
问题是,A
从未指定,因此不能用作任何类型
解决方案是要么使用通配符类型,要么使用Object
而不是A
以下是两个示例解决方案:
Map data=newhashmap()代码>
或
Map data=newhashmap()代码>
同样的事情也必须应用到Dog
类中的map上。问题是,您不能仅仅在Java泛型中引入类型参数并期望它工作。例如查看动物
类:
class Animal {
Map<String, A> data = new HashMap <String, A>();
public void setValue(HashMap<String, ?> val)
{
this.data = val;
}
public Map getValue()
{
return this.data;
}
}
但是,问题是,在初始化新的动物时,需要定义A
,例如:
Animal<String> dog = new Animal<>();
dog.setValue("name", "max"); //<---- ok
dog.setValue("age", 13); //<---- won't compile
现在,您可以在地图中存储从对象
派生的每种数据类型,一个字符串
,甚至一个整数
Animal dog = new Animal();
dog.setValue("name", "max"); //<---- ok
dog.setValue("age", 13); //<---- ok
animaldog=新动物();
dog.setValue(“名称”、“最大值”)// 虽然这种设置不是理想的方式,但一种解决方案是将地图设置为
通用类型。通过这种方式,您可以将任何您想要的内容放入对象部分。然而,这将是一个痛苦的信息拉回来。这就是我如何看待你们的课程变化的
class Animal {
Map<String, Object> data = new HashMap <String, Object>();
public void setValue(Map<String, Object> map)
{
this.data = map;
}
public Map<String, Object> getValue()
{
return this.data;
}
}
class Dog extends Animal {
public void index()
{
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "Tommy");
map.put("favfood", "milk"); // want to pass Lists, Integers also
setValue(map);
}
}
类动物{
Map data=newhashmap();
公共无效设置值(映射)
{
这个数据=地图;
}
公共映射getValue()
{
返回此.data;
}
}
狗类动物{
公共空间索引()
{
Map Map=newhashmap();
地图。放置(“姓名”、“汤米”);
map.put(“favfood”、“milk”);//还要传递列表和整数吗
设定值(map);
}
}
请记住,您不应该混合使用泛型类型和原始类型。我认为最简单的方法是使用对象
而不是a
:
Map<String, Object> data = new HashMap <String, Object>();
Map data=newhashmap();
尽量避免泛型和原始类型的混合。A应该是什么?使用Map data=new HashMap()
来存储任何类型的值谢谢你的回答。键不是固定的,所以我无法创建像上面这样的类。为什么键没有固定?如果您不知道存在哪些字段以及使用哪些类型,那么您的应用程序应该如何工作?@black_belt-这完全是错的,没有什么比“修复此项,它将被删除”:。只要在网上阅读并尝试一些教程,如果有些东西不起作用,请回来。谢谢您的时间和回答。我找到了解决办法。多亏了克里斯·富兰克林。我更喜欢他的解决方案,因为我需要像下面这样立即设置我的值setValue(map)代码>非常感谢
class Animal {
Map<String, ?> data = new HashMap <String, A>();
public void setValue(HashMap<String, ?> val)
{
this.data = val;
}
public Map getValue()
{
return this.data;
}
}
Animal dog = new Animal();
dog.setValue("name", "max"); //<---- ok
dog.setValue("age", 13); //<---- ok
dog.getValue().get("name") //<---- ok
Object name = dog.getValue().get("name") //<---- ok
String name = dog.getValue().get("name") //<---- won't compile
class Animal {
Map<String, Object> data = new HashMap <String, Object>();
public void setValue(Map<String, Object> map)
{
this.data = map;
}
public Map<String, Object> getValue()
{
return this.data;
}
}
class Dog extends Animal {
public void index()
{
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "Tommy");
map.put("favfood", "milk"); // want to pass Lists, Integers also
setValue(map);
}
}
Map<String, Object> data = new HashMap <String, Object>();