Java 如何解释和使用给定接口对象的类?

Java 如何解释和使用给定接口对象的类?,java,oop,design-patterns,reflection,Java,Oop,Design Patterns,Reflection,我有一个接口。我的一个方法将此接口的一个对象作为参数。根据具体的类,我想构建一个不同的对象 public interface Shape { public void draw(); } public class Circle implements Shape { private int radius; //constructor etc. public void draw() { System.out.println("CIRCLE!"); } public

我有一个接口。我的一个方法将此接口的一个对象作为参数。根据具体的类,我想构建一个不同的对象

public interface Shape {
  public void draw();
}

public class Circle implements Shape {
  private int radius;
  //constructor etc.

  public void draw() {
    System.out.println("CIRCLE!");
  }

  public int getRadius() {
    return radius;
  }
}

public class Square implements Shape {
  private int side;

  //constructor etc.

  public void draw() {
    System.out.println("SQUARE!");
  }

  public int getSide() {
    return side;
  }
}


public class MyClass {
  public void myJob(Shape shape) {
    if (shape.getClass().toString().equals("Circle")) {
      // some missing code...what to do here? type cast? transform?
      int radius = shape.getRadius();
    }
  }
}

如何获取
形状
接口,然后根据类的类型从中获取
半径
侧面

所有特定于
形状
的代码都应该位于每个子类覆盖的方法中

public interface Shape {
    public void draw();
    public int getMeasure();
}

public class Circle implements Shape { ... } // The code for the methods in Shape should be written here.

public class Square implements Shape { ... }

public class MyClass {
    public void doWork(Shape shape) {
        int measure = shape.getMeasure();
    }
}
通常,在运行时按名称查找类是可以避免的不必要的麻烦


为问题编辑。

您可以使用instanceof检查它是否是圆的实例,如果是,则将其转换为圆

if (shape instanceof Circle) {
  Circle circle = (Circle)shape;
  int radius = circle.getRadius();
}

首先,不需要为此使用反射,您可以使用关键字
instanceof

public void myJob(Shape shape) {
    if (shape instanceof Circle) {
        // some missing code...what to do here? type cast? transform?
        int radius = shape.getRadius();
    }
}
然后,您要做的是将您的形状投射成一个圆,这样您就可以将其视为一个圆:

public void myJob(Shape shape) {
    if (shape instanceof Circle) {
        Circle circle = (Circle) shape;
        // Some Circle job
        int radius = circle.getRadius();
    }
}
最后,如果如您所说,希望对形状的不同实现应用不同的处理方法,则可以显式键入参数:

public void myJob(Circle circle) {
    // Some Circle job
}

public void myJob(Square square) {
    // Some Square job
}
但是,更好的方法是使用形状界面:

public interface Shape {
    void draw();
    void myJob();
}

public class MyClass {
    public void myJob(Shape shape) {
        shape.myJob();
    }
}

}

问题是什么?你应该研究使用多态性来解决问题,而不是试图将其转换为圆形或方形。因此,你希望处理一个接口,而不是一个具体的类来抽象掉任何实现细节,然后,当你真正掌握了这样的接口时,您坚持确切地知道您正在处理的对象的类型,以便可以调用接口不提供的某些方法。这是毫无意义的。使用多个myJob方法会更好,每个方法都采用不同的类型(圆形、方形等)。使用运算符实例修复损坏的抽象不是一个好的答案。我最终在形状本身中包含了myJob()。因为
shape
将始终调用正确的方法。