java—如何查看类是否实际上是类?

41zrol4v  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(403)

我有一个泛型方法,它应该查找特定类型的类。我设法把那门课作为一门课程 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;
    }
}
uxh89sit

uxh89sit1#

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

它还包含检查和转换示例的有用方法:

Assert.assertTrue(List.class.isInstance(c));
List<Integer> list = List.class.cast(c);
djmepvbi

djmepvbi2#

java泛型在运行时不存在。泛型是严格的编译时安全特性。你能做的就是

public static Class<?> getThatClass2(String nameToMatch) {
  Class<?> clazz = // some internal lookup
  if (clazz.getName().equals(nameToMatch) {
    return clazz;
  } else {
    return null;
  }
}

我没有从其他地方复制/粘贴这个。如果我找到了一个复制品,我会投封闭复制品

相关问题