2012-04-20 2 views
1

와 요소 컬렉션 내가 (정규식 표기법)의 라인을 따라하는 방법 반환 뭔가 시행 할 수있는 방법이 있나요 :유형 검사 다른 특성

(T with A) (T with A with B)+ (T with B) 

내가 Traversable[T]를 반환하는 경우는, 그것은 바운드 특성을 삭제 . 마찬가지로 첫 번째 요소와 마지막 요소에 대해 정확하지 않으므로 Traversable[T with A with B]을 반환 할 수 없습니다.

이 문제를 해결하는 방법을 모르겠습니다. 내 프로그램에 암시 적 조건을 소개하고, .asInstanceOf[] 캐스트를 사용하여 형식 시스템을 남용하고있는 것처럼 느껴집니다. 어쩌면 내가 잘못된 종류의 데이터 구조를 사용하고 있을까요?

다음은 내가 작성한 코드의 예입니다. route 메소드를 적용하려고합니다. User 클래스는 T 유형을 확장합니다. 코드가 많기 때문에 코드를 생략했습니다.

trait Producer extends User { 
    def send(file: Data) 
} 

trait Consumer extends User { 
    def receive(file: Data) 
} 

... 

def route(sender: T with Producer, receiver: T with Consumer): Traversable[T] 

def transfer(sender: T with Producer, receiver: T with Consumer, file: Data) { 
    val path = route(sender, receiver) 
    if (!path.isEmpty) { 
    sender send file 

    val nextHop = route(sender, receiver).tail.head 

    nextHop.asInstanceOf[T with Consumer] receive file 

    if (nextHop != receiver) { 
     transfer(nextHop.asInstanceOf[T with Producer], receiver, file) 
    } 
    } 
} 

답변

3

캐스팅은 반드시 .asInstanceOf[]으로 피하십시오.

스칼라는 튜플을 사용하는 메서드에서 여러 값을 쉽게 반환 할 수 있으므로 (T with A, Traversable[T with A with B], T with B) 유형의 3 개 튜플을 반환하지 않는 이유는 무엇입니까?

trait A 
trait B 
class T 

def f(): (T with A, Traversable[T with A with B], T with B) = { 
    (new T with A, List(new T with A with B), new T with B) 
} 

val (a, abs, b) = f() 
+0

흠 ... 그 나쁜 생각이 아니다 :

다음은 예입니다. 내가 하나의 콜렉션에서 그들을 하나로 모으려고 한 이유는'route() '를 호출 할 때마다 더 투명하게되기를 원했기 때문입니다. 지금 생각해 보면 필요할 경우 튜플을 'Traversable [T]'로 평평하게 만들 수 있다고 생각합니다. –