首页 > 解决方案 > 如何查看一个类是否真的是类?

问题描述

我有一个通用方法,它应该查找特定类型的类。我设法将该类作为 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;
    }
}

标签: javacastingclasscastexception

解决方案


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

推荐阅读