为什么不能将包含通用类型的通用类型分配给通配符类型的通用类型的类

亚当·巴特金(Adam Batkin):

抱歉,标题似乎令人困惑,但请按示例进行操作。

假设我有一些带有通用类型参数的Java类:

public class GenericClass<T> {
}

我可以创建一个类型为存储对象的变量,并将通用参数设置为StringJava还允许我将该变量分配给另一个变量,但将通用参数设置为通配符<?>类型:

GenericClass<String> stringy = ...
GenericClass<?> generic = stringy; // OK

但是,在使用具有泛型参数的类时,如果将该参数的类型设置为泛型,则无法将该类的对象分配给相同类型/泛型的类型,后者(内部/嵌套)参数是通配符类型<?>

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

具体的编译错误是:

Type mismatch: cannot convert from List<GenericClass<String>> to List<GenericClass<?>>

凭直觉,我认为所讨论的作业应该不是问题。那么为什么这个分配有问题呢?

布鲁诺·孔德:

您面临的问题称为协方差

List<GenericClass<String>> stringy = ...
List<GenericClass<?>> generic = stringy;
generic.add(new GenericClass<Integer>());

如果这不是编译错误,那么最后一行代码将是可能的。

您可以通过以下方法解决错误:

 List<? extends GenericClass<?>> generic = stringy;

但您也不能使用,add因为您真的不知道什么? extends GenericClass<?>(再次是协方差)。在这种情况下,您只能通过List进行枚举并期望GenericClass<?>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

通用扩展参数不能分配给参数类型

为什么不能扩展通用类型

为什么我不能将此类型转换为通用类型?

为什么不能将类型SFC <AnchorProps>分配给类型SFC <{}>?

为什么不能将子类型值分配给泛型类型?

Flutter with Translator:为什么不能将参数类型“Future<Translation>”分配给参数类型“String”?

为什么我不能将打字稿泛型类型分配给该类型的联合?

将通用对象分配给Partial类型

将具体地图分配给通用类型的地图

Typescript无法将对象文字分配给通用类型

为什么“数字”类型不能分配给“ T”类型?

为什么子类类型不能分配给类型'this'?

为什么通用类型不是正确的类型?

为什么在通用类中不能有采用不同通用类型参数的方法?

使用通用类型的接口通用类型的类

不能将类型“ number”分配给类型“ ReadonlyArray <{}>”

设置通用类类型

获取通用类类型

通用类型类

通用类:可选类型

为什么不能将方法引用直接分配给Object类型的变量?

为什么不能将Nothing分配给Unit类型的变量?

多层通用类型的Java通配符

包含通用类型类列表的类

打字稿-指定类型的对象无法分配给通用类型

获取通用类型的通用类型

为什么不能将类型的值分配给实现带有接收者类型指针的方法的接口?

通用类型和通配符类型之间的区别

为什么不能为这种通用的Clamp方法推断类型?