Java 这两个通配符之间的区别
下面是方法声明Java 这两个通配符之间的区别,java,generics,Java,Generics,下面是方法声明 public void testMethod(ArrayList<T extends Animal> list) 公共void测试方法(ArrayList列表) 及 公共void测试方法(ArrayList列表) 相同?它们在一个重要方面不相同。对于第一种情况,泛型参数将绑定到类的作用域,并且不会随着方法的多次调用而改变 在第二种情况下,泛型参数将取决于调用方法时使用的参数,并且对于每个单独的调用,泛型参数可能不同 因此,考虑到这一类: public class
public void testMethod(ArrayList<T extends Animal> list)
公共void测试方法(ArrayList列表)
及
公共void测试方法(ArrayList列表)
相同?它们在一个重要方面不相同。对于第一种情况,泛型参数将绑定到类的作用域,并且不会随着方法的多次调用而改变
在第二种情况下,泛型参数将取决于调用方法时使用的参数,并且对于每个单独的调用,泛型参数可能不同
因此,考虑到这一类:
public class MyClass<T extends Animal> {
public void handleList1(List<T> list) {
// implementation
}
public <U extends Animal> void handleList2(List<U> list) {
// implementation
}
}
因为它的泛型参数是由方法提供的参数决定的。不同之处在于前者不编译,而后者编译。这是你问的吗 如果您的意思是:
public void testMethod (ArrayList <? extends Animal> list)
及
公共void测试方法(
ArrayList l1,ArrayList l2)
在第一种情况下,第一个参数是扩展动物的某种类型的ArrayList
,第二个参数是扩展动物的ArrayList
或某种(可能是其他)类型
在第二种情况下,两个参数都是ArralList
s,属于扩展Animal
的相同类型,我想是的。当您需要在多个参数上强制使用相同的泛型类型,或返回相同泛型类型的内容时,后一种方法非常有用。@MattiasBuelens:我想这是一个答案。我不明白。请你说清楚一点好吗?我对泛型有点陌生。你能给我举个例子吗?当然,增加了一个例子,当我不在键盘上打字时,我会格式化phone@Perception,我想你回答的是不同的问题,他想看看List@Michael-我不这么认为。你可能想重读这个问题。哦,是的。我是这个意思。但是我不能理解这个问题answer@user1801716在第一个示例中,您没有绑定到列表类型参数的“类型变量”,因此无法执行任何涉及该类型的操作。在第二个示例中:它是T
“前者不编译”,如果它在类型T
的范围内(例如,类的类型参数),则它会编译。添加了更多的细节,可能会使差异更加清楚。@MikhailVladimirov非常感谢您
MyClass<Bear> test = new MyClass<Bear>();
test.handleList2(new ArrayList<Tiger>);
test.handleList2(new ArrayList<Lion>);
test.handleList2(new ArrayList<Puma>);
public void testMethod (ArrayList <? extends Animal> list)
public <T extends Animal> void testMethod (ArrayList <T> list)
public void testMethod (
ArrayList <? extends Animal> l1,
ArrayList <? extends Animal> l2)
public <T extends Animal> void testMethod (
ArrayList <T> l1, ArrayList <T> l2)