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

时间:2014-06-12 22:40:23

标签: scala generics

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)确保[确保]对象Predef中的类型为[A]的x和方法any2ArrowAssoc(x:A)ArrowAssoc [A]是从x.type到?{def x:?}的可能转换函数 - t

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

4 个答案:

答案 0 :(得分:5)

t名为A的通用参数会隐藏名为A的类。

你所写的内容相当于:

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

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

答案 1 :(得分:3)

在您的示例中,A是具体类型(类)。但是在函数t[A](x: A): Unit中,您尝试将其用作类型参数。关于它没有任何通用。

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

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

此功能将接受任何类型,只需将其打印到控制台即可。

答案 2 :(得分:2)

在您的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
}

答案 3 :(得分:0)

这里有两个混乱的来源:

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

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

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

    因此解决方案就是这样:

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