首页 文章

Scala仿制药对我来说并不清楚

提问于
浏览
0
class A {

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

}

def t[A](x: A): Unit = {

    x.x    // <- error at this line 

}

得到编译错误 - 类型不匹配; found:需要x.type(带底层类型A):?{def x:?}请注意,隐式转换不适用,因为它们不明确:两个方法any2在对象Predef中设置类型[A](x:A)确保[确保]对象类型为[A]的前置部分中的A]和方法any2ArrowAssoc(x:A)ArrowAssoc [A]是可能的转换函数,从x.type到?{def x:?} - t

有人可以用英语解释这个,我是斯卡拉的新手

4 回答

  • 2

    t 的名为 A 的通用参数隐藏了名为 A 的类 .

    你写的相当于:

    class A {
        def x(): Unit = {
          println("tftf")
        }
    }
    
    def t[B](x: B): Unit = {
        x.x    // <- error at this line 
    }
    
  • 0

    在您的示例中, A 是具体类型(类) . 但是在函数 t[A](x: A): Unit 中,你're trying to use it as a type parameter. There'没什么通用的 .

    将泛型与函数一起使用的简单示例如下:

    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
    }
    
  • 5

    这里有两个混乱的来源:

    • 您的类型参数阴影类类型A.

    • 类型参数A是不受约束的,隐含地表示 [A <: Any] ,而 Any 没有成员 x . 令人困惑的错误消息来自编译器尝试将隐式转换从 Any 应用到具有成员 x 的内容 .

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

    因此,解决方案就是:

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

相关问题