2013-07-22 3 views
1

저는 Entity-System에서 작업하고 있습니다. 내 구성 요소에는 런타임에 구성 요소를 작성할 수 있도록 값 개체의 ArrayList가 포함되어 있습니다. 다음은 내 가치 클래스의 :Java의 제네릭 필드에 런타임 객체의 클래스를 전달합니다.

public class Value<V> implements Cloneable{ 

    private V value = null; 
    private String name; 
    public Value() 
{ 
} 

public Value(String name) 
{ 
    this.name = name; 
} 

public V getValue() 
{ 
    return value; 
} 

public void setValue(V value) 
{ 
    this.value = value; 
} 

@Override 
public boolean equals(Object o) 
{ 
    return name.equals(((Value)o).name); 
} 

@Override 
public Value clone() 
{ 
    return new Value<V>(new String(name)); 
} 
} 

의 난이 두 번있는 가치 객체 (이 작품)을 작성한다고 가정 해 보자

: 나는이 작업을 수행 할 수없는 이유

Value<Double> v = new Value<Double>("xCoordinate"); 

Object o = new Double(42); 
Value<o.getClass()> v = new Value<o.getClass>("theAnswer"); 

"o"라는 객체의 클래스를 Value 유형의 변수로 전달하려면 "o"의 런타임 표현에서 클래스를 가져올 수 없습니다.

+0

42/theAnswer 쌍이 더글러스 아담스입니까? – tbodt

+1

음, 분명히 그것은 ... –

+0

일반 선언에 사용 된 유형 이름은'Class' 객체가 아닙니다. –

답변

0

컴파일러가 모든 제네릭 형식 참조를 지우므로이를 수행 할 수 없습니다. 가상 머신은 필드 및 메소드 선언을 제외하고는 제네릭이 존재한다는 것을 알지 못합니다.

이 당신이 무엇을 원하는 경우

컴파일러를 모방 다음과 같은 사용 : 당신은 comipiler 경고를 얻을 것이다

Object o = new Double(42); 
Value v = new Value("theAnswer"); 

을, 당신은 반환 값을 캐스팅해야합니다. 경고를 원하지 않으면 다음을 사용하십시오.

Object o = new Double(42); 
Value<Object> v = new Value<Object>("theAnswer"); 
+0

괜찮습니까? 객체 + 캐스팅을 고수해야합니다. 시스템이 어떤 유형의 매개 변수를 필요로하는지 알기 때문에 가능합니다.) – VaTTeRGeR

+0

이것은 OP의 핵심 질문을 다루지 않습니다. 타입 대신 Object를 사용하기 만하면 제네릭을 사용하는 이유가 없습니다. –

+0

OP의 질문이이 답변을 적용하기에는 충분하지 않다고 생각합니다. 우리는 더 나은 대안을 제안하기 위해 성취하려는 것을 이해해야합니다. –

관련 문제