Vis*_*kur 2 java generics list
我写了以下代码:
public class HashMapImpl<Key,Value>{
Key key;
Value value;
List<? extends Key> keylist;
List<? extends Value> valuelist;
public HashMapImpl(Key k,Value v){
this.key = k;
this.value = v;
keylist = new ArrayList<Key>();
valuelist = new ArrayList<Value>();
}
public Value put(Key k, Value v){
this.keylist.add(k);
}
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误add():
add(capture#3-of ? extends Key)类型中的方法List<capture#3-of ? extends Key>不适用于参数(Key)
为什么会这样?我该如何解决?
? extends Key在这个用例中没有理由使用; 该语法适用于可能更具限制性Key的列表类型,但不一定比限制更严格.因为编译器不知道它只是一个List<Key>,所以它不会让你添加Key,因为列表*的泛型类型恰好比它更具限制性Key.
考虑它的一种方法是,在Collections 的情况下:
add的东西List<? super Foo>,但你不很了解的对象; get(int index)返回一个Object,而不是一个Foo.add的东西List<? extends Foo>,但你知道了很多关于对象; get(int index)确实会回来Foo.tl; dr只需使用:
List<Key> keylist;
List<Value> valuelist;
Run Code Online (Sandbox Code Playgroud)
你的程序将运作.
进一步阅读:Canonical Java Generics FAQ,链接到有界通配符部分