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);