2012-04-20 39 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[]

Scala可以很容易地從使用Tuple的方法返回多個值,那麼爲什麼不返回類型爲(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]」。 – 2012-04-20 20:35:06