用Java中的if语句检查类

用Java中的if语句检查类,java,class,if-statement,Java,Class,If Statement,我想知道是否有一种方法可以用if语句检查对象是哪个类的。我需要这样的东西: if(object.getClass().equals("class Circle")) return object.radius; 这在Java中可能吗?使用instanceof if(object instanceof Circle) 使用instanceof if(object instanceof Circle) instanceof操作符应该执行以下操作: if (object instanceof Ci

我想知道是否有一种方法可以用if语句检查对象是哪个类的。我需要这样的东西:

if(object.getClass().equals("class Circle")) return object.radius;
这在Java中可能吗?

使用instanceof

if(object instanceof Circle)
使用instanceof

if(object instanceof Circle)

instanceof
操作符应该执行以下操作:

if (object instanceof Circle ) {
    return ((Circle) object).radius;
}

instanceof
操作符应该执行以下操作:

if (object instanceof Circle ) {
    return ((Circle) object).radius;
}

大致上,您要查找的是
instanceof
。然而,该公式暴露出对强类型语言中的面向对象编程的固有理解不足:

//Start with no information about 'object'
if(object instanceof Circle) { //Figure out if it is a Circle
  return object.radius; //If so, do something
}
实际上,在Java中,至少在大多数情况下,您应该已经知道要处理哪些函数:

public void getRadius(Object o) {
  //Any old object may not even be related to a geometric thing; o could be a network socket!
}

public void getRadiusBetter(Shape s) {
  //Shapes may or may not have a radius, but at least we are talking about shapes
}

public void getRadiusBest(Circular c) {
  //By definition, c would have the state for the object's radius
}
例如,我们可以将循环定义为:

public interface Circular {
  public double getRadius();
}
这保证了任何圆形对象都能够返回半径。一般来说,您希望以这种方式制定代码,利用强类型,而不是假设您正在处理的对象没有任何信息(如Javascript或其他弱类型语言)。否则,您可能会陷入许多if语句和复杂逻辑的困境,无法确定您是否能够对正在处理的对象提出适当的问题。在Java中,可以自由地进行合理的检查,但始终尝试尽可能具体地描述您的对象

记住,这是:

f(x:TypeA) => y:TypeB
可以在强类型语言中保证,但在弱类型语言中不能保证:

public TypeB f(TypeA x) { ... }

在JS中,您依赖于函数执行它所说的操作。在Java中,如果失败,它将不会编译。

大致上,您要查找的是
实例。然而,该公式暴露出对强类型语言中的面向对象编程的固有理解不足:

//Start with no information about 'object'
if(object instanceof Circle) { //Figure out if it is a Circle
  return object.radius; //If so, do something
}
实际上,在Java中,至少在大多数情况下,您应该已经知道要处理哪些函数:

public void getRadius(Object o) {
  //Any old object may not even be related to a geometric thing; o could be a network socket!
}

public void getRadiusBetter(Shape s) {
  //Shapes may or may not have a radius, but at least we are talking about shapes
}

public void getRadiusBest(Circular c) {
  //By definition, c would have the state for the object's radius
}
例如,我们可以将循环定义为:

public interface Circular {
  public double getRadius();
}
这保证了任何圆形对象都能够返回半径。一般来说,您希望以这种方式制定代码,利用强类型,而不是假设您正在处理的对象没有任何信息(如Javascript或其他弱类型语言)。否则,您可能会陷入许多if语句和复杂逻辑的困境,无法确定您是否能够对正在处理的对象提出适当的问题。在Java中,可以自由地进行合理的检查,但始终尝试尽可能具体地描述您的对象

记住,这是:

f(x:TypeA) => y:TypeB
可以在强类型语言中保证,但在弱类型语言中不能保证:

public TypeB f(TypeA x) { ... }

在JS中,您依赖于函数执行它所说的操作。在Java中,如果失败,它将不会编译。

getClass()
返回一个
类,而不是
字符串。查看
instanceof
。我在这里看到JavaScript背景:)尝试使用完全限定的类名
object.getClass().getName()
。大多数情况下,您应该寻找一种方法来实现多态性,而不是使用
instanceof
。请参阅
getClass()
返回的是
Class
,而不是
字符串
的可能重复项。查看
instanceof
。我在这里看到JavaScript背景:)尝试使用完全限定的类名
object.getClass().getName()
。大多数情况下,您应该寻找一种方法来实现多态性,而不是使用
instanceof
。请参阅正确答案的可能副本。如果你不将物体投射成一个圆,你将无法从中获得半径。谢谢,这正是我想要的!请注意,这是您正在寻找的,但可能会导致错误/不干净的代码。答案很好。如果你不将物体投射成一个圆,你将无法从中获得半径。谢谢,这正是我想要的!请注意,这正是您所寻找的,但可能会导致糟糕/不干净的代码。谢谢您的回答,但我仍然是Java的一小部分类,我甚至从未使用过接口。我确信你想说的是真的,我应该利用多态性,而不是使用一堆if语句来让代码更干净、更易于管理,但是现在我正在尝试完成一个编程任务,它不太清楚需要我做什么,所以我的代码有点乱。我想我需要重新开始编写干净的、类似OO的代码,但我真的没有时间这么做。无论如何,再次感谢你的回答。我只想说,如果你发现你的代码乱七八糟,那是有原因的。确保你在下一步——甚至是这一步——中瞄准原因。利用强类型将减少调试时间。谢谢你的回答,但我仍然是Java的一小部分类,我甚至从未使用过接口。我确信你想说的是真的,我应该利用多态性,而不是使用一堆if语句来让代码更干净、更易于管理,但是现在我正在尝试完成一个编程任务,它不太清楚需要我做什么,所以我的代码有点乱。我想我需要重新开始编写干净的、类似OO的代码,但我真的没有时间这么做。无论如何,再次感谢你的回答。我只想说,如果你发现你的代码乱七八糟,那是有原因的。确保你在下一步——甚至是这一步——中瞄准原因。利用强类型将减少调试时间。