2013-12-16 2 views
1

컬렉션에 저장된 유형 (리터럴) 변수를 선언 할 수 있습니까? 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 

답변

2

당신은 사용할 수 있습니다

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

또는

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

하지만이 클래스는 매개 변수가없는 한 생성자를 가지고 있어야합니다. 좀 더 구체적인 생성자가 필요한 경우, 기본 생성자 사용할 수있는 경우 당신은 사람들이 메소드를 호출 후 팩토리 객체 당신을 공급하고 있어야합니다 다음하지 않을 경우 here

+0

감사합니다. AVolpe 덕분에, 이것은 저장된 유형의 객체를 만드는 데 도움이됩니다. 원래 질문 (해당 유형의 변수 선언)과 관련하여 첫 번째 솔루션은 Object 유형의 변수 인 을 선언하지만 두 번째 코드는 collection 요소에 저장된 유형을 이미 알고 있어야하므로 해당 유형으로 다운 캐스트 할 수 있습니다. – Pedja

+0

질문을 다시 읽은 후에는 리플렉션을 사용하여 메서드를 호출하는 것이 유일한 방법이라고 생각합니다. 컴파일러는'클래스 '가'List'의 어떤 위치에 있는지 알 수 없습니다. 건배 –

1

당신은, newInstance()을 사용할 수 있습니다 참조하십시오

귀하의 개체를 구축하기 위해 공장에서.

생성되는 객체가 실제로 아무것도없는 기본 bean이지만 팩토리가 기본값으로 객체를 올바르게 설정할 수없는 경우를 제외하고는 Factory 패턴이 일반적으로 거의 구현되지 않습니다.

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

즉, 형식 선언은 명시 적이어야합니다.

예를 들어

Java language는 지역 변수 선언에 대한 규칙을 정의

LocalVariableDeclaration: 
VariableModifiersopt Type VariableDeclarators 

Type: 
PrimitiveType 
ReferenceType 

ReferenceType: 
ClassOrInterfaceType 
TypeVariable 
ArrayType 

드릴 다운에 TypeVariable를 (I 전체 언어의 문법을 복사 아니에요 때문에) 우리가 얻을이 :

TypeVariable: 
Identifier 

identifier은 클래스 이름에서 예상되는 것으로 제한됩니다.