Java 如何查看类是否<&燃气轮机;实际上是阶级<;T>;?

Java 如何查看类是否<&燃气轮机;实际上是阶级<;T>;?,java,casting,classcastexception,Java,Casting,Classcastexception,我有一个泛型方法,它应该查找特定类型的类。我设法将该类作为类,现在我想检查它是否真的是请求的类型,如果是,则返回它(否则为null)。看起来唯一有效的代码就是尝试强制转换,如果失败则抛出异常。不过,我担心该代码的性能,因为它将被经常使用,而且我听说抛出异常的性能不是很好 public static <T> Class<T> getThatClass() { Class<?> clazz = // some internal lookup try

我有一个泛型方法,它应该查找特定类型的类。我设法将该类作为
,现在我想检查它是否真的是请求的类型,如果是,则返回它(否则为null)。看起来唯一有效的代码就是尝试强制转换,如果失败则抛出异常。不过,我担心该代码的性能,因为它将被经常使用,而且我听说抛出异常的性能不是很好

public static <T> Class<T> getThatClass() {
    Class<?> clazz = // some internal lookup
    try {
        return (Class<T>) clazz;
    } catch (ClassCastException e) {
        return null;
    }
}

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

public static Class<?> getThatClass2(String nameToMatch) {
  Class<?> clazz = // some internal lookup
  if (clazz.getName().equals(nameToMatch) {
    return clazz;
  } else {
    return null;
  }
}
公共静态类GetHatClass2(字符串名称匹配){
Class clazz=//一些内部查找
if(clazz.getName().equals)(nameToMatch){
回击声;
}否则{
返回null;
}
}

因此,我没有从其他地方复制/粘贴此内容。如果我找到了副本,我会投票选择closed-duplicate

类。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(Number.class.isAssignableFrom(Integer.class));
Assert.assertTrue(Number.class.isAssignableFrom(Double.class));
Assert.assertFalse(Number.class.isAssignableFrom(String.class));
集合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);
Assert.assertTrue(List.class.isInstance(c));
List=List.class.cast(c);

Class
有一个
asSubclass
方法,如果没有,它将抛出一个
ClassCastException
。尽管要使其可行,您需要从某个地方传递
Class
(方法签名、构造函数到实用程序类等)-在您的示例中,运行时无法确定
T.class
将是什么(编译器会相应地抱怨)。“但我担心该代码的性能,因为它会经常使用”。如果您经常使用该代码,我更担心的是您到底在做什么,而不是该代码的性能。这感觉非常像一个。您为什么需要它?您可以始终强制转换反射调用的方法或构造函数的结果……然后该方法必须是
公共静态类GetHatClass(Class clazz)
,因此可以对其进行测试(因为您可以获得
clazz.Class
,但不能获得
T.Class
)。
Assert.assertTrue(List.class.isInstance(c));
List<Integer> list = List.class.cast(c);