【问题标题】:Scala Custome Typed ClassScala 自定义类型类
【发布时间】:2021-06-22 23:43:54
【问题描述】:

我在 Scala 中有以下几行代码。

abstract class Template[A,B] {
    def myMethod[A,B](): A=>B
}  
val concreate = new Template[Int,Int] { 
    def myMethod() = (x:Int) => x*x 
} 

Template 类是一个类型化的,它有一个抽象方法,它返回一个 Function1 类型的函数。 在下一步中,我通过提供类型参数匿名实例化 Template 类,并实现抽象方法。

但是编译器在第二步抛出错误。错误信息是:

Object creation impossible, since method myMethod in class Template of type [A,B]() A=>B is not defined

虽然我提供了类型和实现,但我不确定为什么会发生错误。当我定义方法时,我明白我不需要提供类型,因为编译器可以从匿名类实例化中推断出它。即使我尝试显式提供方法实现的类型。我仍然收到错误消息。

有人可以帮忙吗?谢谢!

【问题讨论】:

    标签: scala generics


    【解决方案1】:

    首先,您正在实施method,但您需要实施myMethod。这就是它没有定义的原因。

    其次,它无论如何都行不通,因为您正在使用方法类型参数隐藏类类型参数。模板的定义等价于:

    abstract class Template[A,B] {
        def myMethod[C,D](): C => D // note how A and B don't matter at all.
    }  
    

    您可能只想在类上有参数:

    abstract class Template[A,B] {
        def myMethod(): A => B
    }  
    

    【讨论】:

    • 感谢奥列格!我将名称命名为方法是一个错字。现在我在我的问题中纠正了它。所以如果我理解正确:如果我想在方法中使用类的相同类型参数,我不应该再次参数化方法。我说的对吗?
    • 可以在同一个方法中同时引用类类型参数和方法类型参数。只是不要给他们起冲突的名字:def myMethod[C,D]: A => B => C => D = ???
    • 方法类型参数意味着不同的东西。您可以在类级别上修复 A 和 B,但根本无法在方法级别上修复 C 和 D。在@jwvh 的示例中,Template#myMethod 的任何实现者都必须支持 C 和 D 的 所有可能的类型。这很有用(例如,list.map(f) 始终有效,无论 f 返回什么),但是场景不同。
    猜你喜欢
    • 2020-10-02
    • 2012-04-08
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 2021-01-25
    相关资源
    最近更新 更多