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>();