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)