如何查看Class>实际上是Class ?

问题描述 投票:0回答:1

我有一个通用方法,该方法应查找特定类型的类。我设法将该类作为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;
    }
}
java casting classcastexception
1个回答
1
投票

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

0
投票

Java泛型在运行时不存在。泛型严格是编译时的安全功能。您可以做的事情类似于

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

我没有从SO上的其他地方复制/粘贴此内容。如果我找到了重复项,那我将投票关闭-重复项

© www.soinside.com 2019 - 2024. All rights reserved.