1

Я пытаюсь добавить методы расширения к Serializable типам, и, похоже, есть ядро ​​в моем понимании класса. Вот отрывок из основ того, что я пытаюсь сделать:Расширение общих Serializables с неявными преобразованиями

class YesSer extends Serializable 

class NoSer 

implicit class SerOps[S <: Serializable](s: S) { 
    def isSer(msg: String) = { 
    println(msg) 
    assert(s.isInstanceOf[Serializable]) 
    } 
} 

val n = new NoSer 
val ln = List(new NoSer, new NoSer) 
val y = new YesSer 
val ly = List(new YesSer, new YesSer) 
// n.isSer("non Serializable") 
ln.isSer("list of non Serializable") 
y.isSer("Serializable") 
ly.isSer("list of Serializable") 

List расширяет Serializable

Это очевидно для меня линия n.isSer не будет компилировать, но также кажется, что ln.isSer также не должен 't компилируется, поскольку его «внутренний» тип - NoSer. Есть ли какое-либо принуждение к Serializeable внутреннего типа ln? Я пытаюсь сделать что-то абсолютно бесхитростное?

+0

Неявное преобразование может быть изменено только для сбора коллекций serializables, но тогда ваш 'y.isSer (« Serializable »)' use case не будет компилироваться, и вы не можете иметь как неявные преобразователи, потому что это становится двусмысленным неявный, который компилятор отклонит. – jwvh

+0

Я также воспользовался этим и смог одновременно иметь несколько неявных def-преобразований в области видимости. 'implicit def serToSerOPs [S <: Serializable] (s: S) = new SerOps (s)' 'implicit def serToSerOPsC [C [_] <: Serializable] (c: C [_]) = новый SerOps (c) ' ' неявный def serToSerOPsCS [C [_] <: Serializable, S <: Serializable] (c: C [S]) = new SerOps (c) ' –

ответ

1

List распространяется Serializable. Таким образом определяется List[A].isSer(String); тип A не имеет значения.

Serializable - это только интерфейс маркера, используемый для указания того, предназначен ли класс для сериализации. Независимо от того, сможете ли вы реально сериализовать объект, зависит от того, является ли весь транзитный объектный граф, внедренный в объект, сериализуемым. Ваш ln завершит сериализацию во время выполнения с помощью NotSerializableException, поскольку он содержит несериализуемые типы. См. the javadoc for java.lang.Serializable (который scala.Serializable распространяется) для более подробной информации.

+0

Это имеет смысл для меня, возможно, мой вопрос более соответствует следующим: что происходит, когда вы пытаетесь сериализовать' ln'. Это то, что я могу, конечно, ответить себе. Спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^