2010-06-21 39 views

回答

11

這裏的問題是,下面的兩個聲明都不同:

def homepageClass[A <: SomeType]: Class[A] // has type parameters 
def homepageClass = classOf[SomeOtherType] // doesn't have type parameters 

來完成你需要聲明一個抽象類型,這樣你想要的東西:

trait SomeTrait{ 
    type A <: SomeType 
    def homepageClass: Class[A] 
} 

object SomeObject extends SomeTrait { 
    type A = SomeOtherType 
    def homepageClass: Class[A] = classOf[SomeOtherType] 
} 

或者

trait SomeTrait[A <: SomeType] { 
    def homepageClass: Class[A] 
} 


object SomeObject extends SomeTrait[SomeOtherType] { 
    def homepageClass: Class[SomeOtherType] = classOf[SomeOtherType] 
} 
2
def homepageClass[A <: SomeType]: Class[A] 

說:「不管的SomeType你給子類A,我可以返回一個Class[A]。特別是,它可以被稱爲是這樣的:

class SomeThirdType extends SomeType 

val x: Class[SomeThirdType] = SomeObject.homepageClass[SomeThirdType] 

更直接等同比丹尼爾給人是一種存在類型:

trait SomeTrait{ 
    def homepageClass: Class[A forSome {type A <: SomeType}] 
} 

trait SomeTrait{ 
    def homepageClass: Class[_ <: SomeType] 
} 

UPDATE:有兩種解決方案之間的差異我可以想想:

  1. 存在類型產生與Java通配符(和their major intended use is interoperation with wildcards)相同的字節碼。

  2. 你可以寫抽象類型成員的解決方案細化類型:

    val x: SomeTrait {type A = SomeOtherType} = SomeObject 
    

    我不認爲你可以對存在的類型。

其他?

+0

如果你現在解釋我的建議和存在型版本之間的區別,那會很棒! :-) – 2010-06-21 18:26:00