java - 如何查看 Class<?> 是否实际上是 Class<T>?

标签 java casting classcastexception

我有一个通用方法,它应该查找特定类型的类。我设法将该类设为 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无一异常(exception)?我想要这样的东西,但遗憾的是,它不能编译:

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 - 如何查看 Class<?> 是否实际上是 Class<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59899275/

相关文章:

java - 添加Spring库时出现"Given parent is not an ancestor of this virtual file"错误

java - Android Activity 随机停止

java - HttpServletRequest - 编码 url 和隐藏字段参数的快速方法

javascript - 如何将长或字符串转换为日期格式(如 HH :mm:ss) in javascript?

java.lang.ClassCastException : java. lang.String 无法转换为 [C

java - Android:点击后退按钮时如何退出 Activity 而不关闭它?

将整数和 float 的字符串转换为 C 中的 float 组

ios - 在 Objective-C 中进行比较 - 使用 ARC 不允许将 'int' 隐式转换为 'id'

json - Grails在BootStrap中注册了一个DateMarshaller,引发了异常,即rails.converters.JSON无法转换为grails.converters.XML

java - 如何将加载的类从外部apk转换为接口(interface)类