Java 泛型中的 extendssuper 是用来限制泛型类型参数的上限和下限的关键字。它们可以在定义泛型类、泛型方法、泛型接口时使用。

extends 关键字用于限制泛型类型参数的上限,表示该泛型类型参数必须是指定类型或指定类型的子类。例如:

public class GenericClass<T extends Number> {
    // ...
}

在这个泛型类中,T 的类型参数被限制为 Number 类型或其子类,例如 IntegerDouble 等。这样定义后,如果我们创建这个泛型类的实例时,T 类型的实参必须是 NumberNumber 的子类。

super 关键字用于限制泛型类型参数的下限,表示该泛型类型参数必须是指定类型或指定类型的父类。例如:

public class GenericClass<T super Integer> {
    // ...
}

在这个泛型类中,T 的类型参数被限制为 Integer 类型或其父类。这样定义后,如果我们创建这个泛型类的实例时,T 类型的实参必须是 IntegerInteger 的父类。

总的来说,extendssuper 关键字的作用是限制泛型类型参数的范围,使得泛型类型参数在使用时更加安全和可靠。

举个例子:

在 Java 中,<R, C extends Column<R>> 是一个泛型类型参数的声明,其中:

  • <R, C> 表示这是一个包含两个类型参数的泛型类型参数声明。
  • extends Column<R> 表示泛型类型参数 C 是一个继承自 Column<R> 类的类型。

这个声明可以被用于定义方法参数、返回类型、类或接口的类型参数等。

具体来说,这个声明的意思是:

  • R 表示这个泛型类型参数中要使用的类型参数,它可以是任何合法的 Java 类型。
  • C 表示这个泛型类型参数中要使用的类型参数,它必须是继承自 Column<R> 的类型,也就是说 C 类型必须包含一个类型参数为 RColumn 类型。

Column 类型可能是一个抽象类或者接口,也可能是一个具体的类,它的定义可能类似于:

public abstract class Column<R> {
    public abstract R getValue();
    public abstract void setValue(R value);
    // ...
}

或者:

public class StringColumn extends Column<String> {
    private String value;
    // ...
}

因此,<R, C extends Column<R>> 声明的类型参数 C 表示一个继承自 Column<R> 的类,可以使用 R 来指定这个类型的值类型。当使用这个类型参数时,需要提供一个满足条件的具体类型,例如:

public <R, C extends Column<R>> void someMethod(C column) {
    // ...
}

StringColumn column = new StringColumn();
someMethod(column);

在上面的例子中,C 被替换为 StringColumn,而 R 被替换为 String。因此,column 参数的类型是 StringColumn,它继承自 Column<String>