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çinclass 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
Teşekkürler. Arayan bu sınıfı nasıl başlatacak? örtülü için gerçek parametreyi nasıl alacağız? –
Mekanikten emin değilim, ama derleyicinin 'automagically' classtag'i sağlayacağını düşünüyorum. –