List<? super T>和之间有什么区别List<? extends T>?
我曾经使用List<? extends T>,但它不允许我添加元素list.add(e),而List<? super T>它.
<? super E>和之间有什么区别<? extends E>?
例如,当你看一下类时java.util.concurrent.LinkedBlockingQueue,构造函数有以下签名:
public LinkedBlockingQueue(Collection<? extends E> c)
Run Code Online (Sandbox Code Playgroud)
并为方法之一:
public int drainTo(Collection<? super E> c)
Run Code Online (Sandbox Code Playgroud) 我有几个关于Java中通用通配符的问题:
List<? extends T>和之间有什么区别List<? super T>?
什么是有界通配符,什么是无界通配符?
为什么我super只能使用通配符而不使用类型参数?
例如,在Collection界面中,为什么toArray方法不是这样写的
interface Collection<T>{
<S super T> S[] toArray(S[] a);
}
Run Code Online (Sandbox Code Playgroud) 我有课A,B,C和D那里B延伸A,C扩展A和D延伸A.
我有以下ArrayList几个,其中包含一些元素:
ArrayList<B> b;
ArrayList<? extends A> mix = b;
Run Code Online (Sandbox Code Playgroud)
我打算让变量mix包含类型的元素B,C或D.我试图类型的元素加入C到mix这样的:
mix.add(anElementOfTypeC);
Run Code Online (Sandbox Code Playgroud)
但IDE不允许我这样做,它说:
通过调用转换的方法,无法将anElementOfTypeC转换为CAP#1,其中CAP#1是一个新的类型变量:CAP#1从捕获?延伸A.
我使用<? extends A>得当吗?我该如何解决这个问题?
我曾经Collections.sort(playersList);排序过List.所以,我认为playersList现在已经整理好了.但是我怎样才能获得列表的第一个元素?playersList[0]不起作用.
具有以下简单的类结构:
class A {
}
class B extends A {
}
class C extends B {
}
Run Code Online (Sandbox Code Playgroud)
我正在创建一个ArrayList来保存先前创建的类的对象:
List<? extends A> list1 = new ArrayList<A>();
List<? extends B> list2 = new ArrayList<B>();
List<? extends C> list3 = new ArrayList<C>();
List<? super A> list4 = new ArrayList<A>();
List<? super B> list5 = new ArrayList<B>();
List<? super C> list6 = new ArrayList<C>();
Run Code Online (Sandbox Code Playgroud)
对于每个列表,我正在尝试添加每个先前创建的类的1个对象:A,B,C.唯一可能的组合是:
将类A,B,C的对象添加到list4
将类B和C的对象添加到list5
将类C的对象添加到列表list6.其余的尝试给出了编译器错误,例如:
类型List中的方法add(capture#1-of?extends A)不适用于参数(A)
为什么我不能将类A,B,C的任何对象添加到list1/2/3?为什么例如list4接受类A,B,C的对象,如果它们应该是A类的超类,因为list4是定义的?
这是我的计划.我不知道为什么我会收到编译时错误.
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List< ? extends Number > list = new ArrayList<Integer>();
list.add(6); // Compile Time Error
System.out.println(list);
}
}
Run Code Online (Sandbox Code Playgroud)
但是以下程序运行正常
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List< ? super Number > list = new ArrayList<Number>();
list.add(6);
System.out.println(list);
}
}
Run Code Online (Sandbox Code Playgroud)
Eclipse出错:
以下是Eclipse的错误描述:
类型List中的方法add(int,capture#1-of?extends Number)不适用于参数(int)
一个)
List<? super Shape> shapeSuper = new ArrayList<Shape>();
shapeSuper.add(new Square()); //extends from SHAP
shapeSuper.add(new DoubleSquare()); //extends from SQ
shapeSuper.add(new TripleSquare()); //extends from DS
shapeSuper.add(new Rectangle()); //extends from SHAP
shapeSuper.add(new Circle()); //extends from SHAP
for (Object object : shapeSuper) { ... }
Run Code Online (Sandbox Code Playgroud)
当我只能添加Shape及其衍生物时,为什么迭代必须是Objects?
B)
List<? super Shape> shapeSuper = new ArrayList<Object>();
shapeSuper.add(new Object()); //compilation error
Run Code Online (Sandbox Code Playgroud)
为什么上面的行会产生编译错误?
这么奇怪!请先查看代码:
public class A {}
public class B extends A {}
public class C extends A {}
public class TestMain {
public <T extends A> void test(T a, T b) {}
public <T extends A> void test(List<T> a, List<T> b) {}
public void test1(List<? extends A> a, List<? extends A> b) {}
public static void main(String[] args) {
new TestMain().test(new B(), new C());
new TestMain().test(new ArrayList<C>(), new ArrayList<C>());
new TestMain().test(new ArrayList<B>(), new ArrayList<C>());
new TestMain().test1(new ArrayList<B>(), new ArrayList<C>());
}
} …Run Code Online (Sandbox Code Playgroud)