Java 调用参数为Class<;的方法;T>;其中T是参数化类型

Java 调用参数为Class<;的方法;T>;其中T是参数化类型,java,generics,Java,Generics,我正在尝试调用一个构造函数方法,该方法如下所示: public static SomeWrapper<T> method(Class<T> arg); 公共静态SomeWrapper方法(类arg); 当T是未参数化类型(如字符串或整数)时,调用非常简单: SomeWrapper<String> wrapper = method(String.class); SomeWrapper=method(String.class); 当T是一个参数化类型,如L

我正在尝试调用一个构造函数方法,该方法如下所示:

public static SomeWrapper<T> method(Class<T> arg);
公共静态SomeWrapper方法(类arg);
当T是未参数化类型(如字符串或整数)时,调用非常简单:

SomeWrapper<String> wrapper = method(String.class);
SomeWrapper=method(String.class);
当T是一个参数化类型,如
List
时,事情就变得棘手了。以下内容无效:

SomeWrapper<List<String>> wrapper = method(List<String>.class);
SomeWrapper=method(List.class);
我唯一能想到的是:

List<String> o = new ArrayList<String>();
Class<List<String>> c = (Class<List<String>>) o.getClass();
SomeWrapper<List<String>> wrapper = method(c);
List o=newarraylist();
类c=(类)o.getClass();
SomeWrapper=方法(c);

当然有一种更简单的方法不需要构造额外的对象吗?

没有。对于
列表
,没有
,只有
列表

见:

因为参数化类型没有精确的运行时类型表示。

类文字表示
表示给定类型的。 例如,类literal
String.class
表示
class
对象,该对象表示该类型
字符串
在 方法
getClass
String
对象。类文本可以 用于运行时类型检查和 供思考

参数化类型将丢失其类型 将参数转换为时的参数 编译过程中的字节码 这个过程称为类型擦除。作为一个 类型擦除的副作用,所有 泛型类型共享的实例化 相同的运行时表示, 即对应的原始 类型。换句话说,参数化 类型没有类型表示 他们自己的。因此,有 形成类文本没有意义 例如
List.class
List.class
List.class
, 因为不存在这样的
对象。 只有原始类型
列表
具有
表示其运行时的 类型。它被称为
List.class

我个人会这样做:

public static <C extends Collection<T>,T> SomeWrapper<C> method(
  Class<C> collClass, Class<T> itemClass)
公共静态SomeWrapper方法(
类collClass,类itemClass)

董事会建议使用以下语法:

SomeWrapper=(SomeWrapper)(Object)方法(List.class);

是的,我知道没有List.class这样的东西。我主要是在寻找某种语法糖,当类型擦除需要在最后执行List时,可以在List.class对象中传递。不幸的是,我无法控制该方法(它是Mockito中的一个库方法),因此更改该方法不是一个选项。@Brian如果您谈论的是
mock()
方法,您只能在没有参数化类型的情况下执行
List List=mock(List.class)
。您可以选择将其强制转换为
列表
,但我相信您知道,这将生成一个警告。我倾向于在这个方法上使用
@SuppressWarnings(“unchecked”)
注释。同样的问题在JPA中经常出现。这里没有语法上的甜点。我实际上使用的是ArgumentCaptor。据我所知,此强制转换是不允许的(是否抑制警告)。ArgumentCaptor predictionCapture=(ArgumentCaptor)ArgumentCaptor.forClass(List.class);
SomeWrapper<List<Foo>> wrapper = (SomeWrapper<List<Foo>>) (Object) method(List.class);