2012-06-30 61 views
4
scala> class A { type T <: String; def f(a: T) = println("foo")} 
defined class A 

scala> (new A).f("bar") 
<console>:9: error: type mismatch; 
found : java.lang.String("bar") 
required: _1.T where val _1: A 
      (new A).f("bar") 
        ^

A有一個抽象類型T,但不是抽象類。創建A(如圖所示)的對象不會定義類型T抽象類型在具體類中的使用?

我的第一個想法是,我被允許通過任何類型的T這是一個字符串的子類,但我不是。那麼在對象中究竟是什麼類型的T以及我允許通過什麼?

回答

5

正如你所說,TA是抽象的;因此,如果您的的子類型爲A,則實際上會修復T,因此您將無法找到任何可以放入方法f的值。

(new A { type T = String }).f("bar") 

的想法是,該類型可以連續細化:

trait Var[A] { def get: A; def set(v: A): Unit } 

trait Sys { 
    type V[A] <: Var[A] 

    def swap[A](x: V[A], y: V[A]): Unit = { 
    val tmp = x.get 
    x.set(y.get) 
    y.set(tmp) 
    } 
} 

trait HistVar[A] extends Var[A] { def created: java.util.Date } 

trait HistSys extends Sys { 
    type V[A] <: HistVar[A] 

    def newest[A](x: V[A], y: V[A]): A = 
    if (x.created after y.created) x.get else y.get 
} 

但是,當然,你的問題是很好的 - 沒有任何理由,你爲什麼會想要一個類的實例具體其類型參數不固定。我想不出一個有意義的案例。 (嗯,當然,你仍然可以擁有的功能,可訪問,如果它不涉及類型T


進一步搜索發現下面,準重複,SO question。你可以在那裏找到一個Scala ticket的參考,它將其描述爲一個'特徵' - 仍然不顯示這個'特徵'實際上有用的情況:)

相關問題