2016-04-04 20 views
0

Ben bunun yerine her varlık için bu Registrator sınıf yazmak zorunda Şimdi AvroScala. jenerik bir sınıf yapma

için
class FooKryoRegistrator extends KryoRegistrator { 
    override def registerClasses(kryo: Kryo) { 
    kryo.register(classOf[Foo], SpecificRecordBinarySerializer(classTag[Foo]))  
    kryo.register(classOf[GenericData.Array[_]], new SpecificInstanceCollectionSerializer(classOf[java.util.ArrayList[_]])) 
    } 
} 

serialize sınıfın her tip için projemde tekrar tekrar görünen bu kodu var (Foo , Bar, Baz .....) projemde bu jeneriğin daha iyi olacağını düşündüm. Bu yüzden

class GenericKryoRegistrator[T] extends KryoRegistrator { 
    override def registerClasses(kryo: Kryo) { 
    kryo.register(classOf[T], SpecificRecordBinarySerializer(classTag[T]))  
    kryo.register(classOf[GenericData.Array[_]], new SpecificInstanceCollectionSerializer(classOf[java.util.ArrayList[_]])) 
    } 
} 

yaptılar Ama bu hata googled ve yerine sınıfın ClassTag kullanmalıdır bir öneri bulundu

class type required but T found 

bir derleme zamanı hatası olsun. Bu yüzden

class GenericKryoRegistrator[T] extends KryoRegistrator { 
    override def registerClasses(kryo: Kryo) { 
    kryo.register(classTag[T].runtimeClass, SpecificRecordBinarySerializer(classTag[T]))  
    kryo.register(classOf[GenericData.Array[_]], new SpecificInstanceCollectionSerializer(classOf[java.util.ArrayList[_]])) 
    } 
} 

için uygulanmasını değişti ama şimdi size sınıf örtük bir argüman olarak sınıf etiketini alırsak

No ClassTag available for T 

cevap

2

, daha sonra kullanabilirsiniz diyor ki:

class GenericKryoRegistrator[T] (implicit ct: ClassTag[T]) extends KryoRegistrator { 
    override def registerClasses(kryo: Kryo) { 
    kryo.register(ct.runtimeClass, SpecificRecordBinarySerializer(ct)) 
    kryo.register(classOf[GenericData.Array[_]], new SpecificInstanceCollectionSerializer(classOf[java.util.ArrayList[_]])) 
    } 
} 
+0

Teşekkürler. Arayan bu sınıfı nasıl başlatacak? örtülü için gerçek parametreyi nasıl alacağız? –

+0

Mekanikten emin değilim, ama derleyicinin 'automagically' classtag'i sağlayacağını düşünüyorum. –

İlgili konular