Java 将对象类型的对象复制到特定类型的对象

Java 将对象类型的对象复制到特定类型的对象,java,Java,因此,我尝试创建一个(不同)对象的数组(在“Triangle”类中定义的对象之一),在对它进行了一段时间的处理之后,我得到了以下结果: public class ShapeContainer { private Object objects []; private int _size; public static final int init_size = 3; public ShapeContainer(ShapeContainer other){

因此,我尝试创建一个(不同)对象的数组(在“Triangle”类中定义的对象之一),在对它进行了一段时间的处理之后,我得到了以下结果:

public class ShapeContainer {

    private Object objects [];
    private int _size;
    public static final int init_size = 3;

    public ShapeContainer(ShapeContainer other){
        this.objects = new Object[other.objects.length];
        this._size = other._size;
        for(int i=0; i<_size ;i++){
            if (other.objects[i].getClass().equals(Triangle.class)){
                this.objects[i] = new Triangle(other.objects[i]);
            }
        }   
    }
 }
现在的问题是,我不能引用obj.p1/obj.p2/obj.p3,因为“Object obj”不能被识别为三角形对象


那么基本上,有没有一种方法可以让一个通用对象被识别为一个特定的对象?如果没有,您是如何处理的?

有一种方法,尽管在我个人看来它的用法不是很干净。给你

public Triangle(Object obj){
  if (obj instanceof Triangle){
      Triangle other = (Triangle) obj;
      this.p1 = new Point(other.p1);
      this.p2 = new Point(other.p2);
      this.p3 = new Point(other.p3);
  }
...
}
为什么我觉得这不是很干净?首先,如果物体不是三角形,我不知道该怎么办。你必须弄清楚这一点,也就是说,如果构造器接收到一个不是三角形的对象,你会怎么做?抛出异常?不确定。。。这通常不会发生在诸如
equals
之类的方法中,其中经常使用
instanceof
,因为这样您就知道只返回
false

然而,至少你知道如何“将物体识别为三角形”


希望这有助于使用数组变量的实际类型(
Triangle
)。如果您需要保存多种不同类型的形状,请创建一个
shape
接口或抽象类,并使用
Triangle extends shape
。您的总体方法已关闭。您根本不应该使用对象类型。为什么不使用Point呢?您试图以错误的方式定义复制构造函数。只要在数组中使用三角形,就可以了。或者定义一个接口(或抽象类)并实现/扩展它们。还要检查instanceof操作符(你的if条件有点奇怪)。当你对一个对象使用超类引用,并且你希望访问子类的方法和字段时,你需要执行一个“cast”。这很简单,就是超级类引用。(只是不要掉入相信强制转换将对象从一种类型“转换”为另一种类型的陷阱。该对象必须已经是强制转换为类型的对象。)@HotLicks:相当简单,相当危险。我打赌OP希望使用有界泛型类型。泛型通常用于消除危险的强制转换,并允许编译时类型检查和错误捕获。如果不是三角形,则该构造函数将不会接收该对象,这意味着我可以在构造函数之外生成异常。是的,知道如何将泛型对象识别为特定对象确实有很大帮助,所以干杯:)@MrGuy:为什么不首先将其设置为
公共三角形(Triangle obj)
?@DarkDust:因为该构造函数不接受对象作为输入,而只接受三角形(请注意,构造函数“public Triangle(Object obj)”除了已经存在的“公共三角形(Triangle obj)”之外,还添加了我想要使用的但是,如果你知道你只想给它提供
三角形
对象,那么像这样对抗类型系统不是一个好主意。在调用构造函数之前检查类型,让调用方进行转换。毕竟,如果你给它提供的不是
三角形
的对象,调用就没有任何意义。如果你创建e是一个接受任何东西的构造函数。(如果我选择坚持给出的答案,而不是简单地将其更改为与强制转换一起使用-只是暗示我知道整个事情是错误的),那么在其他子类(矩形、圆形等)中会有其他构造函数(如三角形中的构造函数)因此,每种不同类型的对象都将有一个不同的“if”,它将发送给不同的子类
public Triangle(Object obj){
  if (obj instanceof Triangle){
      Triangle other = (Triangle) obj;
      this.p1 = new Point(other.p1);
      this.p2 = new Point(other.p2);
      this.p3 = new Point(other.p3);
  }
...
}