0
두 개의 추상적 인 관련이없는 형식 A
및 B
(차이가있을 경우 구현 정보가없는 봉인 된 특성)이 있다고 가정 해 보겠습니다. B
이 예상되는 곳에서 A
을 반품하고 싶습니다. 그 반대의 경우도 마찬가지입니다.스칼라 : 추상 형식 사이에 암시 적으로 변환하는 형식 안전 메서드
이 :
implicit def aToB(a: A): B = a.asInstanceOf[B]
implicit def bToA(b: B): A = a.asInstanceOf[A]
implicit def convertSeq[T, U](s: Seq[T]): Seq[U] = s.map(_.asInstanceOf[U])
내가 A
를 확장하는 모든 유형도 B
을 확장 할 것을 알고 있지만 컴파일러는 이것을 알고하지 않기 때문에 작동합니다. 이 작업을 수행 할 수있는 유형 안전 방법이 있습니까?
trait A
trait B
class X extends A with B
class Y extends A with B
class Z extends A with B
def doSomething(): Seq[A] = Seq(new X(), new Y(), new Z())
def publicFacingMethod1(): Seq[A] = doSomething()
// how can I do this?
def publicFacingMethod2(): Seq[B] = doSomething()
'A'의 모든 하위 유형이 'B'의 하위 유형 인 경우 두 개의 개별 형질이 필요하지 않은 것처럼 들립니다. 아니면, 적어도, 세 번째가 필요하다 : '특성 C는 A와 B를 확장한다'. – Dima
입니다. 100 % 정확함. 불행하게도 나는 정의 된 라이브러리를 제어하지 않는다. 라이브러리의 클라이언트에 세 번째 상용구 유형을 강요하지는 않을 것이다. 그러나 내가 암시 적으로 _that_을 변환 할 수 있다면 ... – OhHeyItsE
사실 내 문제의 연장 일뿐입니다. 나는 이미'X ','Y'',''A와 B''를 가지고 있습니다. 나는 Seq [A]'또는'Seq [B]'를 처리 할 것으로 예상되는 별도의 메소드를 가지고있다. 나는 단지'Seq [A]'만 생성하는 메서드를 가지고 있으며, 기존 인터페이스를 변경하지 않고'Seq [B] '를 처리하는 메서드에 해당 로직을 재사용하고 싶습니다. – OhHeyItsE