创建动态类型Java

时间:2014-04-20 10:11:41

标签: java abstract

解释我的问题:

我有一个名为First的超级抽象类,然后我有很多继承自它的类。 我想建立一种方法,我说" to it"创建一个继承自First class"的类型的ArrayList,但我无法找到解决方案。 例如:

public abstract class First{

   public First(){
   }
}

public class FirstOne extends First{

   ...........
}

//It's a pseudo-code
public class MyProgramClass{

   public creatingMethod(TypeThatInheritFromFirstClass x ){
      return ArrayList<TypeThatInheritFromFirstClass>;
   }
}

我在程序类中插入了creationMethod,但它可以在任何地方(我喜欢在First类中使用静态方法,但它是一个例子)

感谢您的时间

1 个答案:

答案 0 :(得分:0)

您可以使用type token

public class SomeGenerics {
    public static void main(String[] args) {
        List<SubFirst1> list1 = creatingMethod(SubFirst1.class);
        List<SubFirst2> list2 = creatingMethod(SubFirst2.class);
    }
    public static <T extends First> List<T> creatingMethod(Class<T> type) {
        return new ArrayList<>();
    }
}

class First {}
class SubFirst1 extends First {}
class SubFirst2 extends First {}

根据评论编辑:

由于您已经拥有类型令牌,因此您可以使用它来创建该类型的实例。一点限制是,您必须知道要使用的构造函数。如果它们 - 例如 - 都具有无参数构造函数,则可以创建类似的实例:

public static <T extends First> List<T> creatingMethod(Class<T> type) throws ReflectiveOperationException {
    List<T> result = new ArrayList<>();
    result.add(type.newInstance());
    return result;
}

如果你有一个带参数的构造函数(同样:所有子类必须具有相同的参数化构造函数),你必须采用更加困难的方式。带字符串参数的示例:

public static <T extends First> List<T> creatingMethod(Class<T> type, String param) throws ReflectiveOperationException {
    List<T> result = new ArrayList<>();
    Constructor<T> constructor = type.getDeclaredConstructor(String.class);
    result.add(constructor.newInstance(param));
    return result;
}