java - 如何查看一个类是否真的是类?
问题描述
我有一个通用方法,它应该查找特定类型的类。我设法将该类作为 a Class<?>
,现在我想检查它是否真的是请求的类型,如果是,则返回它(否则为 null)。似乎唯一有效的代码是尝试强制转换,如果失败则抛出异常。不过,我担心该代码的性能,因为它会经常使用,而且我听说抛出异常的性能不是很好。
public static <T> Class<T> getThatClass() {
Class<?> clazz = // some internal lookup
try {
return (Class<T>) clazz;
} catch (ClassCastException e) {
return null;
}
}
有没有办法检查是否clazz
是类型E
而没有例外?我想要这样的东西,但遗憾的是,它不能编译:
public static <T> Class<T> getThatClass2() {
Class<?> clazz = // some internal lookup
if (clazz instanceof Class<T>) {
return (Class<T>) clazz;
} else {
return null;
}
}
解决方案
Class.isAssignableFrom(..)
是用于类型检查的非实例变体。用法:
Assert.assertTrue(Number.class.isAssignableFrom(Integer.class));
Assert.assertTrue(Number.class.isAssignableFrom(Double.class));
Assert.assertFalse(Number.class.isAssignableFrom(String.class));
Collection<Integer> c = Arrays.asList(1, 2, 3);
Assert.assertTrue(List.class.isAssignableFrom(c.getClass()));
Assert.assertFalse(Set.class.isAssignableFrom(c.getClass()));
它还包含用于 instanceof 检查和强制转换的有用方法:
Assert.assertTrue(List.class.isInstance(c));
List<Integer> list = List.class.cast(c);
推荐阅读
- r - 尽管 set.seed - 我得到的结果与 R 中的其他人不同
- javascript - 如何让 Insomnia 接受带有换行符的字符串?
- javascript - Modelviewer 未加载本地文件“不允许加载本地资源”
- python - 不理解 processing.py 的错误
- python - Matplotlib 中非等距值的等距刻度
- azure - 使用 ARM 模板创建 SAS 令牌:错误 InvalidValuesForRequestParameters
- python-3.x - 根据唯一ID将pandas数据框划分为测试和训练
- pandas - 计算python中多列的开盘/收盘价格百分比变化
- r - TinyTex 不再适用于 rmarkdown (可能是路径问题?)
- python - Python:如何逐字读取标准输入/文件?