如果类B和类C扩展了类A,我有一个类型为B或C的对象,我如何确定它是哪种类型的实例?
当前回答
使用instanceof操作符查找对象是否属于特定类。
booleanValue = (object instanceof class)
JDK 14扩展了instanceof操作符:你可以指定一个绑定 变量;如果instanceof操作符的结果为真,则 被测试的对象被分配给绑定变量。
请访问官方Java文档以获得更多参考。
说明instanceof操作符用法的示例程序:
import java.util.*;
class Foo{
@Override
public String toString(){
return "Bar";
}
}
class Bar{
public Object reference;
@Override
public String toString(){
return "Foo";
}
}
public class InstanceofUsage{
public static void main(final String ... $){
final List<Object> list = new ArrayList<>();
var out = System.out;
list.add(new String("Foo Loves Bar"));
list.add(33.3);
list.add(404_404);
list.add(new Foo());
list.add(new Bar());
for(final var o : list){
if(o instanceof Bar b && b.reference == null){
out.println("Bar : Null");
}
if(o instanceof String s){
out.println("String : "+s);
}
if(o instanceof Foo f){
out.println("Foo : "+f);
}
}
}
}
输出:
$ javac InstanceofUsage.java && java InstanceofUsage
String : Foo Loves Bar
Foo : Bar
Bar : Null
其他回答
your_instance.getClass().getSimpleName()将给出类型名称,例如:字符串,Integer, Double, Boolean…
在这种情况下我们可以使用反射
objectName.getClass().getName();
例子:-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getClass().getName();
}
在这种情况下,您将获得类的名称,该对象传递给HttpServletRequest接口引用变量。
如果你想在运行时知道,用isinstance()检查是不够的。 使用:
if(someObject.getClass().equals(C.class){
// do something
}
使用instanceof操作符查找对象是否属于特定类。
booleanValue = (object instanceof class)
JDK 14扩展了instanceof操作符:你可以指定一个绑定 变量;如果instanceof操作符的结果为真,则 被测试的对象被分配给绑定变量。
请访问官方Java文档以获得更多参考。
说明instanceof操作符用法的示例程序:
import java.util.*;
class Foo{
@Override
public String toString(){
return "Bar";
}
}
class Bar{
public Object reference;
@Override
public String toString(){
return "Foo";
}
}
public class InstanceofUsage{
public static void main(final String ... $){
final List<Object> list = new ArrayList<>();
var out = System.out;
list.add(new String("Foo Loves Bar"));
list.add(33.3);
list.add(404_404);
list.add(new Foo());
list.add(new Bar());
for(final var o : list){
if(o instanceof Bar b && b.reference == null){
out.println("Bar : Null");
}
if(o instanceof String s){
out.println("String : "+s);
}
if(o instanceof Foo f){
out.println("Foo : "+f);
}
}
}
}
输出:
$ javac InstanceofUsage.java && java InstanceofUsage
String : Foo Loves Bar
Foo : Bar
Bar : Null
任何建议的方法的使用都被认为是基于糟糕的OO设计的代码气味。
如果您的设计很好,您应该不会发现自己需要使用getClass()或instanceof。
任何建议的方法都可以,但只是在设计方面要记住一些东西。
推荐文章
- Java中的@UniqueConstraint注释
- 如何在清洁模式下运行eclipse ?如果我们这样做会发生什么?
- 获取java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory异常
- Java中的正则表达式命名组
- c#和Java的主要区别是什么?
- 什么是NullPointerException,我如何修复它?
- 在Java中使用“final”修饰符
- 无法在Flutter上找到捆绑的Java版本
- 如何在Kotlin解析JSON ?
- 如何在新的材质主题中改变背面箭头的颜色?
- 如何设置OkHttp连接超时
- 用于桌面应用程序的Swing vs JavaFx
- 为什么这个Java程序会终止,尽管它显然不应该(也没有)终止?
- 使用split("|")按管道符号拆分Java字符串
- 当内存不足导致抛出OutOfMemoryError时会发生什么?