我在阅读泛型时遇到了PECS(制片extends人和消费者的super简称).
能否给我一个人解释如何使用佩奇之间解决困惑extends和super?
我有一个List,声明如下:
List<? extends Number> foo3 = new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)
我试图将3添加到foo3.但是我收到如下错误消息:
The method add(capture#1-of ? extends Number) in the type List<capture#1-of ?
extends Number> is not applicable for the arguments (ExtendsNumber)
Run Code Online (Sandbox Code Playgroud) 我无法理解以下语法:
public class SortedList< T extends Comparable< ? super T> > extends LinkedList< T >
Run Code Online (Sandbox Code Playgroud)
我看到类SortedList扩展了LinkedList.我只是不知道是什么
T extends Comparable< ? super T>
Run Code Online (Sandbox Code Playgroud)
手段.
到目前为止我对它的理解是类型T必须是一个实现Comparable的类型......但是它是什么< ? super T >?
我正在尝试学习Java泛型.我不清楚你什么时候使用<T extends Foo>以及何时使用<T super Foo>.这些事情中的每一个对T意味着什么?可以说我有<T extends Comparable>和<T super Comparable>,什么每个这些是什么意思?
我在sun.com上看过几个教程,但我还是迷路了.有人能举例说明吗?
谢谢!
据我所知,它<? super T>代表任何超级类T(T任何级别的父类).但我真的很难想象这个通用绑定通配符的任何现实生活示例.
我明白了什么<? super T>意思,我看过这个方法:
public class Collections {
public static <T> void copy(List<? super T> dest, List<? extends T> src) {
for (int i = 0; i < src.size(); i++)
dest.set(i, src.get(i));
}
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个真实生活用例的例子,可以使用这种结构,而不是解释它是什么.
我想知道泛型如何在这种情况下工作,为什么
Set<? extends Foo<?>> set3 = set1;允许但Set<Foo<?>> set2 = set1;不是?
import java.util.HashSet;
import java.util.Set;
public class TestGenerics {
public static <T> void test() {
Set<T> set1 = new HashSet<>();
Set<?> set2 = set1; // OK
}
public static <T> void test2() {
Set<Foo<T>> set1 = new HashSet<>();
Set<Foo<?>> set2 = set1; // COMPILATION ERROR
Set<? extends Foo<?>> set3 = set1; // OK
}
}
class Foo<T> {}
Run Code Online (Sandbox Code Playgroud) 鉴于:
import java.util.*;
public class Hancock {
//insert code here
list.add("foo");
}
}
Run Code Online (Sandbox Code Playgroud)
在第5行独立插入的哪两个代码片段将在没有警告的情况下编译?(选择两个)
A. public void addString(List list) {
B. public void addString(List<String> list) {
C. public void addString(List<? super String> list) {
D. public void addString(List<? extends String> list) {
Run Code Online (Sandbox Code Playgroud)
正确答案是B&C.
答案A和B对我来说非常清楚.对于答案C&D我知道继承的方式,但是我无法理解为什么答案D不能在Eclipse中编译,而所有其他人都这样做(A有关于通用的警告,B&C没有warrings).
Eclipse中答案D的错误是The method add(capture#1-of ? extends String) in the type List<capture#1-of ? extends String> is not applicable for the arguments (String).
另一方面,这编译:
public void addString() {
List<? extends String> list1 = new ArrayList<String>();
List<? super …Run Code Online (Sandbox Code Playgroud) 在泛型
class A<T extends Number> 被允许
但
class A<T super Integer> 不被允许
我没有明白这一点.这可能听起来像新手问题,但我陷入其中
我正在尝试通过阅读以下内容来学习Java Generics通配符:http: //www.angelikalanger.com/GenericsFAQ/FAQSections/TypeArguments.html#FAQ103
材料中有一个例子:
public class Collections {
public static <T> void copy (List<? super T> dest, List<? extends T> src) {
for (int i=0; i<src.size(); i++)
dest.set(i,src.get(i));
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道我是否可以更改方法签名如下:
public static <T> void copy(List<? super T> dest, List<? extends T> src) {
Run Code Online (Sandbox Code Playgroud)
↓
public static <T> void copy(List<T> dest, List<? extends T> src) {
Run Code Online (Sandbox Code Playgroud)
这两种方法是否存在差异?
例子将不胜感激.
<? extends T>形成只读集合
<? super T>形成只写集合
我以某种方式明白为什么使用只读集合,例如在多线程环境中使用它(还有其他情况吗?)
但为什么要使用只写集合呢?如果您无法在某些时候读取它并使用它的值,那还有什么意义呢?我知道你可以从中获取一个对象,但这违反了类型安全。
编辑:@Thomas 链接的问题(Java 中 <? super T> 和 <? extends T> 之间的差异)确实展示了如何创建只写集合,但没有回答“为什么”你首先需要一个集合。所以它不是重复的
java ×10
generics ×9
super ×3
collections ×2
inheritance ×2
extends ×1
pecs ×1
polymorphism ×1