Я пытаюсь добавить методы расширения к 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
? Я пытаюсь сделать что-то абсолютно бесхитростное?
Неявное преобразование может быть изменено только для сбора коллекций serializables, но тогда ваш 'y.isSer (« Serializable »)' use case не будет компилироваться, и вы не можете иметь как неявные преобразователи, потому что это становится двусмысленным неявный, который компилятор отклонит. – jwvh
Я также воспользовался этим и смог одновременно иметь несколько неявных 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) ' –