gpt4 book ai didi

java - 如何检查抽象对象的实例是否属于特定的子类

转载 作者:行者123 更新时间:2023-11-29 07:24:35 25 4
gpt4 key购买 nike

我在这里引用这个重复的问题:
Check if a Class Object is subclass of another Class Object in Java

我有一个名为“Figure”的抽象父类,我有两个子类“Circle”和“Rectangle”,它们都扩展了这个抽象父类。我试图确定 Figure 对象是 Circle 类型还是 Rectangle 类型。

我的原始代码是:

 public boolean isInstanceOfRectangle(Figure figure)
{
boolean isInstance = figure instanceof Rectangle;
System.out.println("instance of rectangle!");

return isInstance;
}

在研究了上面的链接问题之后,我重写了我的代码如下:

public boolean isRectangle()
{
boolean isInstance = Figure.class.isAssignableFrom(Rectangle);
System.out.println("instance of rectangle!");
return isInstance;
}

出于某种原因,这不起作用,除非我在我的主类中包含以下内容:

public Class<?> Rectangle;
public Class<?> Circle1;

我不确定将它包含在我的类中的意义,如果我不这样做,它似乎要求我将它作为参数包含在我的方法中。我无法正确调用和测试此方法,因为我不确定在调用时将什么参数传递给该方法。我想写这样的东西:

public void mouseReleased(MouseEvent e)
{
if ((isRectangle(shape1)))
addRectangle((Rectangle)shape1, e.getComponent().getForeground());

else if ((isCircle(shape1)))
addCircle((Circle) shape1, e.getComponent().getForeground());
}

其中“shape1”是一个实例化为圆形或矩形的图形对象。因为参数是 Figure 类型,所以我不确定如何定义“isRectangle”方法来获取 Figure 对象(抽象父对象)并具体确定它是哪个子类的实例。或者最好不采用任何参数,仅通过使用 Figure 对象调用方法来完成工作。我有点困惑如何进行。

*编辑:根据用户的建议,我重写了以下 ,它似乎不起作用,因为在这两种情况下输出都是 FALSE。

Figure circleObj = new Circle(Color.BLUE);

System.out.println(isInstanceOfRectangle(circleObj));
System.out.println(isInstanceOfCircle(circleObj));

public static boolean isInstanceOfRectangle(Figure figure)
{
boolean isInstance = figure instanceof Rectangle;
if (isInstance == true)
System.out.println("instance of rectangle!");
else
System.out.println("is NOT a rectangle");
return isInstance;
}


public static boolean isInstanceOfCircle(Figure figure)
{
boolean isInstance = figure instanceof Circle;
if (isInstance == true)
System.out.println("instance of circle!");
else
System.out.println("is NOT a circle");
return isInstance;
}

最佳答案

这将始终返回 false,因为 Figure Class 实例不是 Rectangle 的子类 实例:

boolean isInstance = Figure.class.isAssignableFrom(Rectangle.class); 

您通常希望在不知道运行时类型的变量类上调用 isAssignableFrom()
这会更有意义:

Figure figure = ...;
boolean isInstance = Rectangle.class.isAssignableFrom(figure.getClass());

这样可以知道 figure 变量的类的实例 IS 是否是 Rectangle

引入一种方法来处理需求会更有意义,因为它是动态的,而且它还允许处理不同的类兼容性检查:

  public static boolean isInstanceOf(Figure figure, Class<?> clazz){
boolean isInstance = clazz.isAssignableFrom(figure.getClass());
return isInstance;
}

你可以这样使用它:

System.out.println(isInstanceOf(new Rectangle(), Rectangle.class));    
System.out.println(isInstanceOf(new Circle(), Rectangle.class));
System.out.println(isInstanceOf(new Figure(), Rectangle.class));

打印:

true

false

false

当然,所有这些都将输出true作为FigureCircleRectangle:

System.out.println(isInstanceOf(new Rectangle(), Figure.class));    
System.out.println(isInstanceOf(new Circle(), Figure.class));
System.out.println(isInstanceOf(new Figure(), Figure.class));

关于java - 如何检查抽象对象的实例是否属于特定的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56450218/

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