1

Serializable 유형에 확장 메서드를 추가하려고하는데 클래스를 이해하는 데 구멍이있는 것 같습니다. 여기에 내가 할 노력하고있어의 기초의 조각입니다 :암시 적 변환을 사용하는 일반 Serializable 확장

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 또한 shouldn 보인다 그것의 "내부"유형이 NoSer이기 때문에 컴파일되지 않습니다. ln의 내부 유형의 Serializeable에 어떤 종류의 강요가 있습니까? 절대적으로 무언가를하려고 노력하고 있습니까?

+0

암시 적 변환은 serializables 컬렉션 만 가져올 수 있지만 y.isSer ("Serializable") 유스 케이스는 컴파일되지 않으며 모호한 변환기가되므로 암시 적 변환기를 사용할 수 없습니다 암시 적으로 컴파일러가 거부합니다. – jwvh

+0

또한 이것으로 expeerimented하고 동시에 범위에서 여러 암시 적 def 변환을 가질 수있었습니다. '암시 적 def serToSerOPs [S <: Serializable] (s : S) = 새 SerOps (s)' 암시 적 def serToSerOPsC [C [_] : : Serializable, S <: Serializable> (c : C [S]) : 새로운 SerOps () 암시 적 def serToSerOPsCS [) = new SerOps (c)' –

답변

1

ListSerializable. 따라서 List[A].isSer(String)이 정의됩니다. A 유형은 중요하지 않습니다.

Serializable은 마커 인터페이스이며, 클래스가 직렬화 가능하도록 설계되었는지 여부를 나타내는 데 사용됩니다. 실제로 객체를 직렬화 할 수 있는지 여부는 객체에 뿌리를 둔 전이 객체 그래프가 직렬화 가능 여부에 따라 다릅니다. ln은 비 직렬화 가능 유형을 포함하고 있기 때문에 런타임시 NotSerializableException으로 직렬화에 실패합니다. 자세한 내용은 the javadoc for java.lang.Serializable (scala.Serializable 연장)을 참조하십시오.

+0

이것은 나에게 의미가있다. 어쩌면 나의 질문은''ln'을 직렬화하려고 할 때 어떤 일이 벌어 질지에 관한 것이다. 그것은 내가 분명히 자신에게 대답 할 수있는 사람이다. 고맙습니다! –

관련 문제