Java 上界通配符的好处是什么?

Java 上界通配符的好处是什么?,java,generics,wildcard,bounded-wildcard,Java,Generics,Wildcard,Bounded Wildcard,我发现的反复解释是,上界通配符这个概念也适用于有界泛型,例如: static <T extends Number> void gMethod (ArrayList <T> list) {} staticvoidgmethod(arraylistlist){} 指定时,此方法的泛型将接受Number类型的对象或其任何子类: ArrayList <Integer> intList = new ArrayList(); gMethod(intList); //

我发现的反复解释是,上界通配符这个概念也适用于有界泛型,例如:

static <T extends Number> void gMethod (ArrayList <T> list) {}
staticvoidgmethod(arraylistlist){}
指定时,此方法的泛型将接受Number类型的对象或其任何子类:

ArrayList <Integer> intList = new ArrayList();
gMethod(intList); // allowed
ArrayList intList=new ArrayList();
gMethod(intList);//允许
为了进一步说明,绑定到Number的泛型也将接受Number或其任何子类的类型参数:

class Thing <T extends Number> {}
Thing <Number> numThing = new Thing();
Thing <Integer> intThing = new Thing();
Thing <Double> dubThing = new Thing(); // All three instances work
类事物{}
事物数=新事物();
Thing intThing=新事物();
事物dubThing=新事物();//这三个例子都有效
有鉴于此,使用上界通配符与有界泛型相比,我所能看到的唯一好处是,可以声明上界通配符类型参数,而无需依赖已由类或方法声明的类型参数。有没有我错过的更重要的好处

“使用上界通配符与有界泛型相比,我能看到的唯一好处是…”

如果您的用例一次只需要处理一件
事情
,那么您所需要的就是您概述的简单使用场景

但最终您将有一个用例,您将需要处理不同种类的
事物
。这时您将需要从工具箱中取出稍微高级一点的多态性

“我是否错过了更重要的好处?”

听起来您缺少的一个超级重要的好处是类型之间的可替换关系;称为

例如,因为这样做是合法的:

Integer[] intAry = {2,4,6,8};
Number[] numAry = intAry;
    
List<Integer> intList = List.of(8,6,7,5,3,0,9);
List<Number> numList = intList; // but this fails to compile
numThing = intThing; // but this fails to compile
直觉上,你应该能够做到这一点:

Integer[] intAry = {2,4,6,8};
Number[] numAry = intAry;
    
List<Integer> intList = List.of(8,6,7,5,3,0,9);
List<Number> numList = intList; // but this fails to compile
numThing = intThing; // but this fails to compile
直觉上,你应该能够做到这一点:

Integer[] intAry = {2,4,6,8};
Number[] numAry = intAry;
    
List<Integer> intList = List.of(8,6,7,5,3,0,9);
List<Number> numList = intList; // but this fails to compile
numThing = intThing; // but this fails to compile
具有上界的通配符有效地使
事物
更直观:

Thing<? extends Number> numThing = new Thing<>();        
numThing = intThing; /* That makes sense! */
“适用于有界的泛型…此方法的泛型将接受…上界通配符与有界的泛型。”


您错误地称之为“泛型”的东西“实际上被称为或;取决于。

您没有显示任何有界通配符的示例……是的,这只是一个您不想麻烦命名的参数。不需要发明一个只使用一次的名称。如果有人想知道,这似乎是主要的好处(如果不是唯一的)一般使用通配符。我只是碰巧在处理上界通配符时遇到了这个问题。我看到了更多的原因,但我不确定它们是否算是一个答案。1)这取决于你想用这个
列表做什么。如果这是一个通配符,你能在里面放点什么吗?2)如果你真的不在乎
t
>(我的意思是你不会在方法内部使用任何变量作为
T
类型),那么一般建议去掉它并使用
wildcard
3)通配符可以有一个单一的界限,而类型引用可以有更多的界限(当原始/擦除类型被派生时,这一点很重要)4)当我已经有一个类型参数而不想引入另一个时,我发现自己可以引入一个通配符。例如:
public void(ListI在我的问题中应该更清楚。我的问题与方法签名中类型参数的函数有关,这些示例都没有解决我的问题。我正在比较具有有界通配符类型参数的参数化方法参数的函数与具有有界pa类型参数的参数化方法参数的函数参数。在您的上一个代码段中,您可以用一个有界类型参数替换有界通配符,并且,如果边界相同,结果将是相同的。除了通配符的简洁性之外,一个通配符似乎没有任何优势。除了wildc的简洁性之外,一个通配符似乎没有任何优势ards。。。“-如果你这么说,酋长。如果你认为有好处,请随意分享。但是,我认为你不理解协方差是什么。通配符和类型参数实现协方差是相同的,通配符和类型参数在方差方面的唯一区别是通配符也是逆变的,使它们成为双变量晚一点。不过别担心,泛型通常会让人困惑,我相信你会掌握窍门的