2010-06-21 40 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