声明存储在集合中的类型(文字)的变量

时间:2013-12-16 19:31:55

标签: java class variables declaration literals

是否可以声明存储在集合中的类型(文字)的变量? 或者这可能更像是解释的特征/任务,而不是像Java这样的编译语言?

例如:

import java.util.*;

class Base {}
class A1 extends Base{}
class A2 extends Base{}

public class Test{

    public static void main(String[] args){

        ArrayList<Class<? extends Base>> typeArrayList=new ArrayList<Class<? extends Base>>();
        typeArrayList.add(A1.class);
        typeArrayList.add(A2.class);
        typeArrayList.add(A1.class);
        typeArrayList.add(A1.class);
        //etc. etc.

        //now that all the types are nicely stored in a collection,
        //could we somehow use them to declare variables of those types?
        //e.g. declare something like:
        //typeArrayList.get(1) someVariable;

    }//main
}//Testlass

3 个答案:

答案 0 :(得分:2)

您可以使用:

Object o = typeVarArrayList.get(1).newInstance();

Type o = (Type) typeVarArrayList.get(1).newInstance();

但是你需要该类有一个没有参数的构造函数。

如果您需要更具体的构造函数,请参阅here

答案 1 :(得分:1)

如果有可用的默认构造函数,则可以使用newInstance(),如果没有,则需要让人们为您提供工厂对象,然后在工厂中调用方法来构建对象。

对于大多数实现来说,Factory模式通常也更整洁,除非正在创建的对象实际上只是普通的bean而只有默认值,因为工厂允许您正确设置对象。

答案 2 :(得分:1)

    //e.g. declare something like:
    //typeArrayList.get(1) someVariable;

简而言之,不,类型声明必须是明确的。

例如,Java language为局部变量声明定义了这些规则:

LocalVariableDeclaration:
 VariableModifiersopt Type VariableDeclarators

Type:
 PrimitiveType
 ReferenceType

ReferenceType:
 ClassOrInterfaceType
 TypeVariable
 ArrayType

深入研究 TypeVariable (因为我没有复制整个语言语法)我们得到:

TypeVariable:
 Identifier

identifier仅限于您在课程名称中所期望的内容。