-1
  1. 我不明白泛型类或方法中类型参数的强烈定义。这是一个引用类型,这样......什么?它只是不可具体化的类型吗?编译器的所有引用类型都是可具体化的还是不可具体化的,这是真的吗?

2.考虑众所周知的代码:

List<? extends String> strs= new ArrayList<String>();
? extends String str;//error
strs.add("sd");//error

为什么? extends String str;无效?我认为如果我们声明对泛型类型的引用,例如List<E> strs;对于某种类型,E那么编译器会将类型参数定义为特定类型E

我不明白这个案子会发生什么List<? extends String> strs?是否List<? extends String>和,例如List<String>在编译时进行类似的解析或List<? extends String>解析不同于List<E>某些可具体化的类型E

4

2 回答 2

1

泛型用于指定类型。

考虑以下类定义:

public interface List<E> extends Collection<E>  

这告诉我们,我们有一个可以容纳任何类型元素的 List。
请注意对E.

如果我们像这样定义一个类:

public class MyList<T extends String> implements List<T>

我们现在有一个实现 List 的 MyList,但只接受Strings(或 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
TMyStringType

现在在课堂笔记中T提到的所有地方都将被 MyStringType 替换。
但是如果我想处理一个字符串,但不一定是 MyStringType。

解决方案:
我这样定义一个成员:

List<? extends String> strs;  //Will fill the data in later

现在我们有一个名为 strs 的列表,它只接受字符串,但不会强制使用 MyStringType 类型的字符串。
此列表不受实例化T时已修复的定义的约束。 当我们为 分配一个值时,如果是固定的,则 List 的风格。在您的示例中,它将是一个字符串列表。 MyList
strs

? extends String str;//error 

该变量无法固定,因为在创建包含它的类时无法确定其类型。

于 2013-10-09T18:22:40.140 回答
0

泛型是为读取而不是为写入而设计的。这就是为什么您可以在方法的参数中使用泛型,但不能使用它来声明一个变量,您可以在之后使用它进行读/写:-)

于 2013-10-09T17:09:05.700 回答