Java 通配符与类型参数 class Employee{//valid } 类EmployeeWhere声明泛型

Java 通配符与类型参数 class Employee{//valid } 类EmployeeWhere声明泛型,java,generics,wildcard,bounded-wildcard,pecs,Java,Generics,Wildcard,Bounded Wildcard,Pecs,在引入泛型类型标记之前,不能使用它 在方法示例中,您试图在错误的位置声明T,这是无效的语法。你必须事先介绍一下 然而,对于类示例,您已经将其放在了正确的位置 在这里,您可以在类范围内引入泛型类型标记: class Employee<T extends Number> { // valid } class Employee<? extends Number> { // invalid } private static void test(List<? super

在引入泛型类型标记之前,不能使用它

在方法示例中,您试图在错误的位置声明
T
,这是无效的语法。你必须事先介绍一下

然而,对于类示例,您已经将其放在了正确的位置

在这里,您可以在类范围内引入泛型类型标记:

class Employee<T extends Number> {  // valid
}

class Employee<? extends Number> { // invalid
}

private static void test(List<? super Number> list1) { // valid
}

private static <T>void test(List<T super Number> list1) { // invalid
}
在介绍了
T
之后,您将像那样使用它。例如,请列出

public class Foo<T extends Number> { ... }

// or

public <T extends Number> void foo(...) { ... }
可以使用
列表
列表
甚至
列表
调用。我们称这样一个列表为
Dog
s的消费者。准确地说,这些是所有可以接受狗的列表,因此
list.add(newdog())
可以工作

另一方面,我们有

public static void foo(List<? super Dog> list) { ... }
您需要引入
T
,以确保列表的类型与给定元素匹配。否则,有人可以执行您不希望的添加列表(狗、猫)

如果不需要实际命名类型,也可以使用通配符。例如,获取列表并打印其所有内容的方法:

public static <T> void addToList(List<T> list, T element) {
    list.add(element);
}
publicstaticvoidprintall(列表){
用于(对象:列表){
System.out.println(对象);
}
}

这是否回答了您的问题?这也很有用,可能是因为:@GauthamM它没有回答我的问题。我的问题与什么有关?与T无关,与有界参数或extends和super无关,以及何时使用。@DeepakAgrawal第二个链接是关于
T
vs
可以工作,但是
正确吗?@Zabuzard in方法不工作。只有在你还请强调原因的情况下才可以?不适用于类定义。类Foo@DeepakAgrawal,因为它毫无意义。此时必须引入类型标记,
不是类型标记。所以这对Java来说毫无意义。我不知道你到底想用它实现什么。
public <T extends Number> void foo(List<T> list) { ... }
public static void foo(List<? super Dog> list) { ... }
public static void foo(List<? extends Dog> list) { ... }
public static <T> void addToList(List<T> list, T element) {
    list.add(element);
}
public static void printAll(List<?> list) {
    for (Object object : list) {
        System.out.println(object);
    }
}