泛型本身有没有办法在 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
假设我有一个具有以下签名的函数:
<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