如何更改新实例运行时的类型

时间:2011-03-06 10:07:10

标签: java

这是我的问题

public class Row{
  //It is just a class
}

public class RowUsedByThisClass{

  public Row someOp(Row r){
   /*I am Using this method with r a instance of Row.
    *r may be sub type of the Row. I have to inspect r and have to 
    *return a new instance. But the new instance just cant be type
    *Row it should be exact subtype r belongs.In shor i have to 
     *determin the type of return object runtime.
    *Is it possible in java? Can i use generics.
    */
  }

}

7 个答案:

答案 0 :(得分:2)

如果Row的每个子类都有一个无参数构造函数,那么在someOp内可以使用r.getClass().newInstance()

答案 1 :(得分:1)

这需要反思,而不是泛型:

Row newRow = r.getClass().newInstance();

但是,这要求类具有默认(无参数)构造函数。

答案 2 :(得分:1)

我认为你应该为someOp()的每个子类实现Row

然后你基本上使用方法分派作为检测类的机制,并且可以为每个类适当地处理op。

答案 3 :(得分:0)

您可以使用getClass()函数来确定对象的类型。

答案 4 :(得分:0)

实际上,您有两种方法可以确定对象类型。

首先使用关键字instanceof:

if (row instanceof MyRow) {
    // do something
}

其次是使用getClass():

Class clazz = row.getClass();
if (clazz.equals(MyRow.class)) {}
if (MyRow.calss.isAssignableFrom(clazz)) {}

然后你可以决定你想要什么。例如,您甚至可以创建扩展Row并返回它的其他类的新实例,或者使用参数包装传递的行。

答案 5 :(得分:0)

您可以而且应该在类型签名中指定:

public class RowUsedByThisClass <T extends Row> {
  public T someOp (T t) {

答案 6 :(得分:0)

您可以使用reflection API和一些仿制药来实现您的目标。

import java.lang.reflect.Constructor;

class Row {
    //It is just a class
}

class RowUsedByThisClass {

    public <R extends Row> R someOp(final R r) {
        R newR = null;
        try {
            // Use no-args constructor
            newR = (R) r.getClass().newInstance();
            // Or you can use some specific constructor, e.g. in this case that accepts an Integer, String argument
            Constructor c = r.getClass().getConstructor(Integer.class, String.class);
            newR = (R) c.newInstance(1, "2");

            // do whatever else you want
        } catch (final Exception ex) {
            // TODO Handle this: Error in initializing/cconstructor not visible/...
        }
        return newR;
    }
}