Java泛型放在Map <String,?扩展List <String >>

6 java generics collections list map

有没有办法以类型安全的方式进行以下实现?

public void myMethod( Map<String, ? extends List<String>> map )
{
   map.put("foo", Collections.singletonList("bar");
}
Run Code Online (Sandbox Code Playgroud)

上述实现不起作用.它需要一个正确Map<String, ? super List<String>>编译方法map.put().但myMethod不会以这种方式接受List的任何子类型.所以,我必须Map<String, ? extends List<String>>改用.如何以类型安全的方式解决此问题?

Kit*_*YMG 20

public void myMethod( Map<String, List<String>> map ) {
    map.put("foo", Collections.singletonList("bar") );
}
Run Code Online (Sandbox Code Playgroud)

你不能把一个List的(返回类型Collections.singletonList()Map? extends List,因为实际的类型可能是任何实现List.例如,它是不是安全的把一个普通的ListMap<String,LinkedList>因为List可能不是LinkedList.不过,我们可以很容易地把一LinkedListMap<String,List>.

我想你已经在考虑你的仿制药了.您不必使用? extends非泛型类.例如,List<Object>将保持任何Object,? extends不需要添加对象.A List<List<Foo>>只会获取List<Foo>对象而不是List<FooSubclass>对象[通用类不会根据其参数继承].这是? extends发挥作用的地方.同时添加List<Foo>List<FooSubclass>List,该类型必须是List<List<? extends Foo>>.

  • +1是一个很好的解释(现在你的泛型是可见的:P). (2认同)

Mic*_*ers 6

不行Map<String, List<String>吗?有什么特别的原因你必须在那里有一个通配符吗?