2016-10-04 8 views
1

특수 클래스 용 클래스 객체를 가져와야합니다. 예 :스칼라 - 특수 클래스 용 클래스 가져 오기

import breeze.linalg.DenseVector 

val compileTimeClass = classOf[DenseVector[Double]] 
println(compileTimeClass) 

val denseVector = DenseVector(0.5, 1.0, 1.0, 0.5) 
println(denseVector.getClass) 

출력은 다음과 같습니다

내가 제대로 이해한다면
class breeze.linalg.DenseVector 
class breeze.linalg.DenseVector$mcD$sp 

는, 스칼라는 런타임에 DenseVector의 전문 버전을 만들고있다? Kryo와 직렬화하기 위해 이러한 특수 클래스 중 하나를 등록해야하므로이 문제는 저에게 중요한 문제입니다.

DenseVector의 특수 인스턴스에서 getClass를 호출하는 것 이외에 특수화 된 유형의 Class 객체를 가져 오는 방법이 없습니까?

+0

DenseVector를 수정할 수 있습니까? – talex

+0

아니요. DenseVector는 Spark ML에서 사용되는 Breeze 라이브러리에 있습니다. 나도 myslef를 만들지 않아, ML API가 나를 위해 그것을 않습니다. –

+0

음 ...''DenseVector '를'kryo '로 등록하면됩니다. 'DenseVector [A]'를 다룰 수 있어야합니다.'A '도'kryo'에 등록되어 있어야합니다. –

답변

0

음 ... 모든 유형 매개 변수화 된 클래스에서 발생합니다. 예를 들어

scala> classOf[List[Int]] 
res8: Class[List[Int]] = class scala.collection.immutable.List 

scala> val l = List[Int](1, 2, 3, 4) 
l: List[Int] = List(1, 2, 3, 4) 

scala> l.getClass 
res9: Class[_ <: List[Int]] = class scala.collection.immutable.$colon$colon 

List 이제 다시 질문에오고, 나는 그냥 kryoDenseVector를 등록 할 필요가 있다고 생각합니다.

Akryo.

+0

문제는 제네릭과 함께 타입 소거가 아닙니다. - 역시 일어나고 있지만 kryo가 처리 할 수 ​​있습니다. 전문 수업입니다. http://www.scala-notes.org/2011/04/specializing-for-primitive-types/ –

+0

내가 여기에서 암시하고 자하는 것은 당신이'List'와 같은 방식으로 할 수 있다는 것입니다 . –

+0

다음과 같은 의미입니다. kryo.register (classOf [breeze.linalg.DenseVector [_]]) 동적으로 생성 된 전문화가 아니라 컴파일시 알려진 DenseVector 형식을 등록 할 때 불행히도 작동하지 않습니다 런타임에. Kryo는 당신이 전문 수업에 등록하지 않았을 때 분명히 던졌습니다. 나는 튜플이 또한 전문적이며 twitter.chill의 ScalaTupleSerialization에 의해 처리된다는 것을 알았다. –

1

에 등록 될 때 그 kryo은 비록 것으로 밝혀 한, 어떤 DenseVector[A]를 처리 할 수 ​​있어야합니다 후 :

kryo.register(classOf[breeze.linalg.DenseVector$mcD$sp]) 

쇼를 컴파일 시간 오류로 IntelliJ, 실제로 컴파일되고 예상대로 작동합니다. 이는 우리가 사용하고 직렬화하는 모든 전문 분야를 명시 적으로 등록해야 함을 의미합니다. Twitter Chill 라이브러리는 자동으로 등록 및 직렬화 코드를 생성하여 Tuple * 클래스에 대해 이것을 반올림합니다. https://github.com/twitter/chill/blob/develop/scripts/tuple_serializers.scala