泛型本身有没有办法在 Java 中获取类型参数?

Is there any way for generics themselves to take type parameters in Java?

假设我有一个具有以下签名的函数:

<T> T f(List<T> a, T b)

显然,我可以执行以下操作:

List<Integer> list = new ArrayList<Integer>();
int x = 0;
int y = f(list, x);

但是,我不允许这样做:

List<List<?>> list = new ArrayList<List<?>>();
List<Integer> x = new ArrayList<Integer>();
List<Integer> y = f(list, x);

在那种情况下,我想要的是这样的签名:

<T, V> T<V> foo(List<T<?>>, T<V> x)

但是,这有两个问题。首先,Java 根本不让我这样做,引用 Type 'T' does not have type parameters。其次,我假设我描述的第一种可能情况将不再可能。

所以,我的问题是:有没有办法编写一个带有允许上述两种情况的签名的函数?

<T> T f(List<? super T> a, T b)

可以做到这一点。编译:

List<List<Integer>> list = new ArrayList<>();
List<Integer> x = new ArrayList<>();
List<Integer> y = f(list, x); // T is List<Integer>

如果您想要一个单独的方法来处理 T 的列表:

<T> List<T> fList(List<List<T>> a, List<T> b)

List<List<Integer>> list = new ArrayList<>();
List<Integer> x = new ArrayList<>();
List<Integer> z = fList(list, x); // T is Integer