【问题标题】:Scala generics not clear to meScala泛型我不清楚
【发布时间】:2014-08-03 09:41:38
【问题描述】:
class A {

    def x(): Unit = {
      println("tftf")
    }

}

def t[A](x: A): Unit = {
    x.x    // <- error at this line 
}

我得到编译错误 - 类型不匹配;找到:x.type(具有基础类型 A) 需要:?{def x: ?} 请注意,隐式转换不适用,因为它们不明确:在类型 [A](x: A)Ensuring[ 的对象 Predef 中的两个方法 any2Ensuring A] 和 [A](x: A)ArrowAssoc[A] 类型的对象 Predef 中的方法 any2ArrowAssoc 是从 x.type 到 ?{def x: ?} 的可能转换函数 - t

有人能用英语解释一下吗?我是 Scala 的新手。

【问题讨论】:

  • 您可以将 A 作为类名,并使用 def t[T](x: A): Unit = ... 之类的函数,如果这样可以清楚的话(除了 LimbSoup 答案)

标签: scala generics


【解决方案1】:

t 的名为 A 的泛型参数会隐藏名为 A 的类。

你写的相当于:

class A {
    def x(): Unit = {
      println("tftf")
    }
}

def t[B](x: B): Unit = {
    x.x    // <- error at this line 
}

【讨论】:

    【解决方案2】:

    在您的示例中,A 是一个具体类型(一个类)。但是在函数t[A](x: A): Unit 中,您试图将其用作类型参数。没有什么通用的。

    在函数中使用泛型的简单示例如下:

    def t[A](x: A): Unit = println("Here is the parameter x: " + x)
    

    此函数将接受任何类型,并将其打印到控制台。

    【讨论】:

      【解决方案3】:

      在您的def t[A](x: A) 中,A 是泛型类型参数,与您定义的class A 无关。你可以随意命名,比如def t[T](x: T)

      你真正想做的是:

      def t[B <: A](x: B): Unit = {
         x.x    //  won't error
      }
      

      【讨论】:

        【解决方案4】:

        这里有两个混淆来源:

        1. 您的类型参数 A 会影响类类型 A。

        2. 类型参数 A 是无约束的,隐含表示 [A &lt;: Any],而 Any 没有成员 x。令人困惑的错误消息来自编译器尝试将隐式转换从 Any 应用到具有成员 x 的东西。

        您只需要一个函数,其参数是 A 的子类型,但您不需要类型参数,因为类类型 A 的任何子类型都是作为函数参数的类类型 A 的有效替换。

        因此解决方案很简单:

        def t(a: A) {
            a.x()
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多