【问题标题】:What's the Scala for a declaration of "Class<? extends SomeType>"声明“Class<? extends SomeType>”的 Scala 是什么
【发布时间】:2011-03-06 09:24:42
【问题描述】:

我显然遗漏了为什么以下内容无法编译:

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

class SomeOtherType extends SomeType

object SomeObject extends SomeTrait{
def homepageClass = classOf[SomeOtherType]
}

【问题讨论】:

    标签: scala parameters types


    【解决方案1】:

    这里的问题是下面两个声明不同:

    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]
      

      比 Daniel 给出的更直接的等价物是存在类型:

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

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

      更新:我能想到的解决方案之间的两个区别:

      1. 现有类型生成与 Java 通配符(和 their major intended use is interoperation with wildcards)相同的字节码。

      2. 您可以为抽象类型成员解决方案编写一个细化类型:

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

        我认为你不能用于存在类型。

      还有其他人吗?

      【讨论】:

      • 如果你现在解释一下我的建议和存在类型版本之间的区别,那就太好了! :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 2016-04-06
      • 1970-01-01
      • 2015-09-25
      相关资源
      最近更新 更多