2011-10-02 4 views
2

기본적으로 Map을 유형 객체별로 인덱싱하고 싶습니다. 이 경우 클래스를 "유형 유형"으로 사용하려고합니다.스칼라에서 유형 객체 컬렉션을 만드는 방법

다음 코드를

class SuperClass {} 
val typemap = new HashMap[Class[_ <: SuperClass], SuperClass] 

def insertItem1[T <: SuperClass] (item : T) = typemap += classOf[T] -> item 
def insertItem2[T <: SuperClass] (item : T) = typemap += item.getClass -> item 

(1) classOf [T]를 분명히 잘못 되었기 때문에, 컴파일되지 않습니다 :

error: class type required but T found 

(2) item.getClass은 잘못된 유형입니다 :
중 드롭 일 :

Type mismatch, expected: Class[_ <: SuperClass], actual: Class[_] 

나는이 작업을 수행하는 두 가지 방법을 참조 전자 형식 요건 만
를 클래스 [_]를 사용하거나

하지만를 (아직 어떤 예 환영 그렇게하는 방법을 잘 모르는) 대신 클래스의 매니페스트 사용보다 일반적으로, 왜 classOf [T] 무효 및 방법 매개 변수화 된 유형에 대한 클래스 객체를 얻으려면 어떻게해야합니까?

업데이트 : 나는 item.getClass.asInstanceOf[Class[T]]을 사용하여 클래스 개체에 연결할 수 있음을 알았습니다. 하나 들어, 이것은 추한 것입니다. 분명히

def isPresent[T <: SuperClass] = typemap contains classOf[T] 

내가 insertItem에 asInstanceOf 방법을 사용하고 isPresent에 대한 매개 변수로 클래스를 전달할 수 : 나중에 코드에서 내가 이곳과 같은 기능을 가지고 있기 때문에이 들어, 많은 도움이되지 않습니다. 더 좋은 방법이 있습니까?

+1

왜 종류별로 개체를 저장하고 검색해야합니까? 더 많은 컨텍스트가 주어지면'classOf' 또는'getClass'를 전혀 포함하지 않는 다른 솔루션이 없다는 것이 궁금합니다 ... – huynhjl

+0

나는 이것이 http://stackoverflow.com/questions/7335946의 복제본이라고 생각합니다./class-type-in-scala-map-in-scala – Sohum

+0

usecase는 기본적으로 주어진 유형의 모든 (등록 된) 객체를 가져올 수있는 엔티티 시스템입니다. 따라서 각 유형에 대해 특별한 종류의 키를 정의 할 수 있지만 Class 객체는 해당 키입니다. 제네릭없이 할 수있는, 단순히 클래스 개체를 주위에 키로 전달할 수 및 다음 작동합니다. 그러나 나는 더 좋은 방법이 있다고 생각했다. – matejcik

답변

2

이를 달성하기 위해 매니페스트를 사용할 수 있습니다.

+0

내가 이해할 수없는 것은 putThing에서 지우는 방법으로 T를 잃을 수 있다는 것입니다. 결국 t.getClass를 통해 얻을 수 있기 때문에 런타임에 알려야합니다. – matejcik

1

실행시 제네릭을 사용할 수 없다는 문제도 다시 한번 나타납니다. 컴파일러는 T이 무엇인지 파악하는 작업을 수행하지만 런타임에만 알고 있기 때문에 실행할 수 없습니다.

매니페스트를 사용하여 해당 정보를 얻을 수 있습니다 : What is a Manifest in Scala and when do you need it?. 당신은 삭제를 통해 유형을 잃어 가고있다

class TypeMap extends HashMap[Class[_], Any] { 
    def putThing[T](t: T)(implicit m: Manifest[T]) = put(m.erasure, t) 
} 

val map = new TypeMap 
map.putThing(4) 
map.get(classOf[Int]) // returns Option[Any] = Some(4) 

을, 그래서 당신은 매니페스트를 사용하여 클래스의 이름을 포함하는 putThing에 암시 적 인수를 추가해야합니다

관련 문제