如果课程B
和课程C
扩展了课程A
并且我有B
或C
类型的对象,我该如何确定哪种类型这是一个实例?
答案 0 :(得分:746)
if (obj instanceof C) {
//your code
}
答案 1 :(得分:316)
使用Object.getClass()。它返回对象的运行时类型。
答案 2 :(得分:154)
提供了多个正确答案,但还有更多方法:Class.isAssignableFrom()
并且只是试图转换对象(可能会抛出ClassCastException
)。
让我们总结一下测试对象obj
是否为C
类型实例的可能方法:
// Method #1
if (obj instanceof C)
;
// Method #2
if (C.class.isInstance(obj))
;
// Method #3
if (C.class.isAssignableFrom(obj.getClass()))
;
// Method #4
try {
C c = (C) obj;
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
// Method #5
try {
C c = C.class.cast(obj);
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
null
处理 null
处理方式有所不同:
false
为obj
(null
不是任何事件的实例),前两个方法中的表达式评估为null
。NullPointerException
。 null
因为null
可以转换为任何类型!要记住:
null
不是任何类型的实例,但可以>>投射到任何类型。
Class.getName()
不应该用于执行“is-instance-of”测试,因为如果对象不是C
类型,而是它的子类,它可能有一个完全不同的名称和包(因此类名显然不匹配)但它仍然是C
类型。Class.isAssignableFrom()
不是对称:obj.getClass().isAssignableFrom(C.class)
的类型是false
的子类,obj
将返回C
。答案 3 :(得分:31)
您可以使用:
Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object
HTH。但我认为大多数情况下,将它用于控制流程或类似的东西是不好的做法......
答案 4 :(得分:24)
任何使用任何建议的方法都被视为代码气味,它基于糟糕的OO设计。
如果你的设计很好,你不应该发现自己需要使用getClass()
或instanceof
。
任何建议的方法都可以,但只需记住一些设计方法。
答案 5 :(得分:15)
在这种情况下我们可以使用反射
objectName.getClass().getName();
实施例: -
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getClass().getName();
}
在这种情况下,您将获得对象传递给HttpServletRequest
接口参考变量的类的名称。
答案 6 :(得分:13)
“Class
”类上还有一个.isInstance
方法。如果您通过myBanana.getClass()
获得了对象的课程,则可以通过
myApple
是否是与myBanana
相同的类的实例
myBanana.getClass().isInstance(myApple)
答案 7 :(得分:0)
isinstance()
进行检查是不够的。 使用:
if(someObject.getClass().equals(C.class){
// do something
}
答案 8 :(得分:0)
我在GeneralUtils类中使用了打击功能,请检查它是否有用
public String getFieldType(Object o) {
if (o == null) {
return "Unable to identify the class name";
}
return o.getClass().getName();
}
答案 9 :(得分:0)
我使用Java 8泛型来获取运行时的对象实例,而不必使用切换用例
public <T> void print(T data) {
System.out.println(data.getClass().getName()+" => The data is " + data);
}
传递任何类型的数据,该方法将打印您在调用时传递的数据类型。例如
String str = "Hello World";
int number = 10;
double decimal = 10.0;
float f = 10F;
long l = 10L;
List list = new ArrayList();
print(str);
print(number);
print(decimal);
print(f);
print(l);
print(list);
以下是输出
java.lang.String => The data is Hello World
java.lang.Integer => The data is 10
java.lang.Double => The data is 10.0
java.lang.Float => The data is 10.0
java.lang.Long => The data is 10
java.util.ArrayList => The data is []
答案 10 :(得分:0)
您可以使用 getSimpleName()。
假设我们有一个对象: Dog d = new Dog(),
我们可以使用以下语句获取类名:Dog。例如:
d.getClass()。getSimpleName(); //返回字符串“ Dog”。
PS:d.getClass()将为您提供对象的全名。