是否可以声明存储在集合中的类型(文字)的变量? 或者这可能更像是解释的特征/任务,而不是像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
答案 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仅限于您在课程名称中所期望的内容。