【问题标题】:Generics Handling LinkedHashMap<String, LinkedHashMap>泛型处理 LinkedHashMap<String, LinkedHashMap>
【发布时间】:2018-05-05 07:26:23
【问题描述】:

我在泛型方面从未如此出色,但我使用了 SnakeYaml。 有没有办法让我修复这段代码

public class MyService{
private static Map<String, LinkedHashMap> myYamlMap;

public static void filter(Map<String, String>){
    //myYaml map reads the YAML File using SnakeYaml
    //Snake Yaml returns data in this format <String,LinkedHashMap>
    Yaml yaml = new Yaml(); 
    Object object = yaml.load(reader); 
    Map<String, LinkedHashMap> myYamlMap = (Map<String, LinkedHashMap>)object; 

    LinkedHashMap<String, LinkedHashMap> mainMap = (LinkedHashMap<String, LinkedHashMap>)myYamlMap.get("sample");
}

} 并摆脱这个编译时警告?

Multiple markers at this line
    - Line breakpoint:MyService [line: 69] - filter(Map<String, String>)
    - Type safety: Unchecked cast from LinkedHashMap to LinkedHashMap<String,LinkedHashMap>
    - LinkedHashMap is a raw type. References to generic type LinkedHashMap<K,V> should be 
     parameterized
    - LinkedHashMap is a raw type. References to generic type LinkedHashMap<K,V> should be 
     parameterized

Snakeyaml..在其构造中使用 LinkedHashMap,我想摆脱强制转换。

【问题讨论】:

  • 为什么不让值有类型参数Map&lt;String, LinkedHashMap&lt;String, LinkedHashMap&gt;&gt;
  • 试过同样的问题。
  • 好的。最后一个 LinkedHashMap 也必须输入
  • 你能分享你的代码伙伴吗?这样我就可以看
  • 我的代码?我没有任何代码。我的意思是所有对LinkedHashMap 的引用都必须有适当的类型参数。

标签: java generics collections snakeyaml


【解决方案1】:

给定您的代码:

private static Map<String, LinkedHashMap> myYamlMap;
LinkedHashMap<String, LinkedHashMap> mainMap = (LinkedHashMap<String, LinkedHashMap>)myYamlMap.get("sample");

这没有意义。

private static Map<String, LinkedHashMap> myYamlMap;

这应该是

private static Map<String, Map<Key, Value>;
myYamlMap = new LinkedHashMap<String, Map<Key, Value>>;
myYamlMap.put("key1", new LinkedHashMap<Key,Value>();

对于某些KeyValue 类型,您的代码中没有指定... 或者更复杂的东西——见下文

LinkedHashMap<String, LinkedHashMap> mainMap = (LinkedHashMap<String, LinkedHashMap>)myYamlMap.get("sample");

你在这里使用get似乎暗示myYamlMap应该是

private static Map<String, Map<String, Map<Key, Value>> myYamlMap;
myYamlMap = new LinkedHashMap<String, Map<String, Map<Key,Value>>>;
Map<Key,Value> temp = new LinkedHashMap<Key,Value>();
temp.put(k1, value1);
myYamlMap.put("sample", temp);

因为您似乎希望 get() 从外部集合中返回 Map&lt;String,Map&lt;Key,Value&gt;&gt;

现在你可以做

Map<String, Map<Key,Value>> mainMap = myYamlMap.get("sample");

使用Map 接口的原因是,您的代码中没有任何地方使用特定于LinkedHashMap 的方法,因此除了实例化映射时,所有声明都应该只使用Map&lt;...&gt;

【讨论】:

  • 我已编辑我的代码以显示值。能不能再查一下。我已经清除了大部分杂物。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
相关资源
最近更新 更多