我想在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()
答案 0 :(得分:3)
来自 Effective Java :
规则有两个小的例外,你不应该在新代码中使用原始类型,这两个原因都源于在运行时擦除泛型类型信息的事实。您必须在类文字中使用原始类型。规范不允许使用参数化类型(尽管它允许使用数组类型和基本类型)。换句话说,
List.class
,String[].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];