2014-01-13 87 views
1

所以我试图做一个(不同的)对象的数组(在'三角'类中定义的那些对象之一),在弄乱它一段时间后,这是我有:将对象类型的对象复制到特定类型的对象中

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]); 
      } 
     } 
    } 
} 

对于工作我做了在三角类一个新的构造(注:三角形是内置了3个对象:点P1,P2点,点p3。每个Point对象都由2个双变量构成:x,y):

public Triangle (Object obj){ 
     this.p1 = new Point(obj.p1); 
     this.p2 = new Point(obj.p2); 
     this.p3 = new Point(obj.p3); 
    } 

现在问题是我不能引用obj.p 1/obj.p2/obj.p3,因为“Object obj”未被识别为三角形对象。

所以基本上,有没有办法将通用对象识别为特定对象?如果没有,你如何处理?

+0

使用实际类型('Triangle')作为你的数组变量。如果您需要保存多种不同类型的图形,请创建一个“Shape”接口或抽象类并使用“Triangle extends Shape”。 – chrylis

+1

您的总方法已关闭。你根本不应该使用Object类型。为什么不用Point来代替? –

+0

你试图以错误的方式定义拷贝构造函数。只需使用Triangle作为阵列,你就会好起来的。或者定义一个接口(或一个抽象类)并实现/扩展它们。同时检查instanceof操作符(如果条件有点奇怪)。 – elbuild

回答

1

有一种方法,虽然它的使用并不是很干净,但我个人认为。这里是

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

但是,至少你知道怎样才能“将一个物体识别为三角形”。

希望这会有帮助

+0

那么,如果构造函数不是三角形的,那么构造函数将不会接收到该对象,这意味着我可以在构造函数之外创建异常。 是的,知道如何识别通用对象作为特定的对象确实有很大的帮助,所以欢呼:) – MrGuy

+0

@MrGuy:为什么不首先将它制作为“公共三角形(Triangle obj)”? – DarkDust

+0

@DarkDust:因为那个构造函数不会接受一个输入对象,所以只有一个三角形(注意我想要使用的构造函数“public Triangle(Object obj)”,除了已经存在的“public Triangle Triangle obj)“ – MrGuy

相关问题