gpt4 book ai didi

java - 将 Java 类型与类进行比较

转载 作者:搜寻专家 更新时间:2023-11-01 03:52:25 25 4
gpt4 key购买 nike

我在将这个简单示例放在一起时遇到了一些麻烦。

通过反射,我可以获得某个声明字段的类型。但我如何将其与已知类进行比较?

我想做的是:

Type t = myField.getType();
if (t.equals(MyOwnClass.class)) {
// Now I know myField is of type MyOwnClass
}

最佳答案

基本上,您已经找到了正确的答案,只需要一点评论。另一个答案是错误的。

首先,getType()返回 Class<?>引用,带有 Class实现 Type 的类界面;使用 Type isAssignableFrom() 的变量调用错误有两个原因:

  • Type没有 isAssignableFrom()方法
  • Class#isAssignableFrom()需要 Class<?>参数,不是 Type参数

简单地说,您可能不应该比较 Class/Type这样,因为您隐藏了相关的输入并需要不必要的转换。另一方面,你刚刚升级了 Class<?>引用Type引用,自equals()调用Class (甚至转换为 Type )实际上调用 Object#equals() , 它只是调用

public boolean equals(Object obj) {
return (this == obj);
}

直接来自 Object.java , 作为 Class.java不会以任何方式覆盖它。

其次,您可以做您已经做过的事情,但这是正确的方法之一:

if ( myField.getType() == MyOwnClass.class ) {
// Now I know myField is of type MyOwnClass
} // note that this requires a single ClassLoader to be used! Two ClassLoaders could in theory load one class with two separate Class instances

或者,你可以

if ( myField.getType().getCanonicalName().equals( MyOwnClass.class.getCanonicalName() ) {
// Now I know myField is of type MyOwnClass
} // note that this uses a name comparison, not a class comparison

甚至

if ( myField.getType().isAssignableFrom( MyOwnClass.class )) {
// Now I know MyOwnClass objects can be cast to myField.getType() safely
} // note: they are either equal or MyOwnClass is a subclass of myField.getType()

tl;dr 使用 equals()Class 上object 在这里是不必要的,因为两个相等的类必须是 ==无论如何,转换到Type也是如此- 尽管如此,您在问题中提供的答案确实是一个可行的解决方案。

关于java - 将 Java 类型与类进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22040873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com