我有一个通用方法,该方法应查找特定类型的类。我设法将该类作为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);
Java泛型在运行时不存在。泛型严格是编译时的安全功能。您可以做的事情类似于
public static Class<?> getThatClass2(String nameToMatch) {
Class<?> clazz = // some internal lookup
if (clazz.getName().equals(nameToMatch) {
return clazz;
} else {
return null;
}
}
我没有从SO上的其他地方复制/粘贴此内容。如果我找到了重复项,那我将投票关闭-重复项