如果类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。

任何建议的方法都可以,但只是在设计方面要记住一些东西。