为什么这个通用赋值不起作用?

时间:2012-08-07 11:14:29

标签: java generics wildcard

我有一个像这样的方法:

<T extends ImportedGroupTxtContact> Importer<T> createImporter(Class<T> classToImport) 

在方法体中,这很好:

ParseResult<? extends ImportedGroupTxtContact, ?> parseResult = new ParseResult<ImportedGroupTxtContact, ChildContactField<?>>();

但事实并非如此:

ParseResult<T, ?> parseResult = new ParseResult<ImportedGroupTxtContact, ChildContactField<?>>();

这对我没有意义,因为T extends ImportedGroupTxtContact具有与? extends ImportedGroupTxtContact相同的上限。究竟出了什么问题?

2 个答案:

答案 0 :(得分:3)

T延伸ImportedGroupTxtContact。所以它可以是ImportedGroupTxtContact的任何子类。让我们用Fruit替换它。 Apple扩展了Fruit。但你做不到

Basket<Apple> basket = new Basket<Fruit>();

事实上,Basket<Apple>只接受苹果,而Basket<Fruit>接受任何种类的水果。

答案 1 :(得分:2)

您要将ParseResult<A, B>分配给ParseResult<T, ?>,其中T可能等于A,也可能不等于T,因此必须失败。更准确地说,A可以是T的任何子类型。第一个示例中的?和{{1}}都具有相同的上限这一事实不会在此处输入等式。