检索类类型,并实例化一个相同类型的新类型

时间:2018-04-28 16:15:41

标签: java class

我有一个类动物,它有两个子类Cat和Dog。我想写一个复制方法。既然Cats and Dogs都会重现,那么这种方法应该放在动物身上,显然猫只应该生产猫等等。所以在超级类动物中我有类似的东西:

public void Reproduce(){
   addAnimal(new Type);
}

其中Type表示我们想要制作另一个的类(所以猫或狗)。当然,我想编写代码,以便以后可以添加其他类别的动物,如马或其他东西。所以我想要的是这样的:

public void Reproduce(){
   addAnimal(new this);
}

这样cat.Reproduce()将启动类Cat的新实例,而dog.Reproduce()将实例化一个新的Dog等。

有办法做到这一点吗?或者有没有办法让方法检索调用它的实例的类类型,然后实例化一个新类型?

编辑:为了更清楚,我找到了一些不同的方法来找出当前的类,例如this.getClass();.但是,我还没有找到一种方法来使用该信息来创建相同类型的新类。做这样的事情:

Class c = this.getClass();
Animals offspring = new c; 

不起作用。

1 个答案:

答案 0 :(得分:1)

有两种选择。首先是让你的类实现像这样的Cloneable接口

class Cat implements Cloneable {
  // all your properties and methods

  @Override
  public Cat clone() throws CloneNotSupportedException {
        return (Cat)super.clone(); // if you need deep copy you might write your custom code here
  }

  public void Reproduce(){
    Cat c = this.clone();
    // change some properties of object c if needed
    addAnimal(c);
  }
}

第二个选项是使用反射(您可能需要在反射的使用周围添加try{} catch()块)

public void Reproduce() {
   Constructor c = tc.getClass().getDeclaredConstructor(String.calss, Integer.class); //pass types of parameters as in consrtuctor you want to use. In 
            //this case I assume that Cat class has constructor with first parameter of type String and second parameter of type Integer
   Cat cat = (Cat)c.newInstance("someString", 2); 
   // change some properties of object c if needed
   addAnimal(cat);
}