对不起,如果标题看起来令人困惑,但有些例子是有序的.
假设我有一些带有泛型类型参数的Java类:
public class GenericClass<T> {
}
Run Code Online (Sandbox Code Playgroud)
我可以创建一个类型的变量来存储一个对象,通用参数设置为,比如a String.Java还允许我将该变量分配给另一个变量,但将generic参数设置为通配符<?>类型:
GenericClass<String> stringy = ...
GenericClass<?> generic = stringy; // OK
Run Code Online (Sandbox Code Playgroud)
但是,当使用带有泛型参数的类时,如果将该参数的类型设置为泛型,则不能将该类的对象分配给相同类型/泛化类型,后者(内部/嵌套)参数是通配符类型<?>:
GenericClass<GenericClass<String>> stringy = ...
GenericClass<GenericClass<?>> generic = stringy; // Compile Error
// And just in case that is confusing, a more
// realistic example involving Collections:
List<GenericClass<String>> stringy = ...
List<GenericClass<?>> generic = stringy; // Compile Error
Run Code Online (Sandbox Code Playgroud)
具体的编译错误是:
Type mismatch: cannot convert from List<GenericClass<String>> to List<GenericClass<?>>
Run Code Online (Sandbox Code Playgroud)
直觉上我认为有问题的作业不应成为问题.那么为什么这个任务有问题呢?
您所面临的问题是以协方差命名.
List<GenericClass<String>> stringy = ...
List<GenericClass<?>> generic = stringy;
generic.add(new GenericClass<Integer>());
Run Code Online (Sandbox Code Playgroud)
如果这不是编译错误,那么最后一行代码是可能的.
你可以通过这样做来解决错误:
List<? extends GenericClass<?>> generic = stringy;
Run Code Online (Sandbox Code Playgroud)
但你也不能使用,add因为你真的不知道是什么? extends GenericClass<?>(Covariance再一次).在这种情况下,您只能枚举List并期望GenericClass<?>.
| 归档时间: |
|
| 查看次数: |
452 次 |
| 最近记录: |