我可以在泛型类型上获得Clazz.class吗?

时间:2014-04-01 09:48:32

标签: java generics generic-list

我想在EasyMock.isA(Class<T>)上调用List<MyType>。有没有办法在没有警告的情况下做到这一点?

我尝试了以下内容:

isA(List<MyType>.class);  // doesn't compile
isA(List.<MyType>class);  // syntax error on tokens (MyType), misplaced construct
isA(List.class);          // This gives a warning: Type safety: The expression of type List needs unchecked conversion to conform to List<MyType>

修改

Jakub HR给出了正确答案。但是,对于我需要EasyMock的特殊情况,我可以简单地使用

EasyMock.<List<MyType>>anyObject()

4 个答案:

答案 0 :(得分:3)

来自 Effective Java

  

规则有两个小的例外,你不应该在新代码中使用原始类型,这两个原因都源于在运行时擦除泛型类型信息的事实。您必须在类文字中使用原始类型。规范不允许使用参数化类型(尽管它允许使用数组类型和基本类型)。换句话说,List.classString[].class和int.class都是合法的,但List<String>.class and List<?>.class不合法。

答案 1 :(得分:0)

由于JVM中的类型参数擦除,您无法检查它(除非您使用自定义通用List类,该类也存储在相应类型的实际Class<?>对象内(必须手动提供))<登记/> 这是因为在运行时无法知道泛型类型参数 - List<String>List<MyType>等所有“被删除”到List<Object>(或只是List - 在运行时没有区别。也许您还想阅读a more deep example out of the web

答案 2 :(得分:0)

建议/接受的答案相当不正确。这是一个更完整的答案:

text-align: center; <!DOCTYPE html> <html> <head> <style> .center { display: flex; justify-content: center; align-items: center; height: 200px; border: 3px solid green; } </style> </head> <body> <div class="center"> <p>I am vertically and horizontally centered.</p> </div> </body> </html> myMock.myMeth(isA(List.class)); // #1 fails if arg == null, warnings

myMock.myMeth(EasyMock.<List<MT>> anyObject()); // #2 succeeds even when arg == null myMock.myMeth(anyObject()) // #3 same as #2

因此,如果您确实想要与isA()相同的行为,请使用notNull()而不是anyObject()。请注意,使用anyObject()或notNull()时,实际上是依靠编译器来确保被调用的代码确实传递了正确的List。如果您设法以某种方式将其他对象“伪装”到调用中(几乎是不可能的),则EasyMock不会用anyObject()或notNull()来捕获它。

答案 3 :(得分:-1)

您可以按以下方式获取:

Class<T> persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];