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