泛型用于指定类型。
考虑以下类定义:
public interface List<E> extends Collection<E>
这告诉我们,我们有一个可以容纳任何类型元素的 List。
请注意对E
.
如果我们像这样定义一个类:
public class MyList<T extends String> implements List<T>
我们现在有一个实现 List 的 MyList,但只接受String
s(或 decedents)。
在这个类里面我们可以参考T
。
public class MyList<T extends String> implements List<T> {
private ArrayList<T> internalStorage;
关键点
在类定义中,我们定义了什么T
是;它是任何基于字符串的类。
因此可以在类 T 内部引用。
然而,直到类实际实例化后,T 的风格才会得到修复:
MyList<MyStringType> test = new MyList<MyStringType>(parameters); //java 6
MyList<MyStringType> test = new MyList<>(parameters); //java 7, same but shorter.
现在 Java 知道类 T 中的 MyStringType 是什么T
意思。
有了知识,Java 编译类并将所有引用替换为对实际类的引用。
它完全忘记了T。MyList
T
MyStringType
现在在课堂笔记中T
提到的所有地方都将被 MyStringType 替换。
但是如果我想处理一个字符串,但不一定是 MyStringType。
解决方案:
我这样定义一个成员:
List<? extends String> strs; //Will fill the data in later
现在我们有一个名为 strs 的列表,它只接受字符串,但不会强制使用 MyStringType 类型的字符串。
此列表不受实例化T
时已修复的定义的约束。
当我们为 分配一个值时,如果是固定的,则 List 的风格。在您的示例中,它将是一个字符串列表。 MyList
strs
? extends String str;//error
该变量无法固定,因为在创建包含它的类时无法确定其类型。