为trait中指定的方法使用泛型内部伴随对象返回类实例

时间:2015-03-22 20:52:46

标签: scala generics

Scala 中,我想为使用泛型的特征中定义的方法返回一个类的实例,我的代码示例如下:

文件1

package packOne

import packTwo.A

trait MyTrait[T <: MyTrait[T <: A]] {
    def otherFunct(): String
    def funct[T <: A](): T
}

文件2

package packTwo

import packOne.MyTrait

abstract class A(someParameter: String) {}

class B(someParameter: String) extends A(someParameter) {}

object B extends MyTrait[B] { // <--- the B inside MyTrait here is the class not the object, or at least that is what I want
    def otherFunct(): String = "Hello"
    def funct[B](): C = new B("hi") // <--- I think here is the key
}

基本上我想要的是一个接口,它具有返回类A的具体实现的方法,在实现对象中(恰好是扩展A的类的伴随对象)

为什么我希望它在一个对象上?,是因为我想调用该方法而不需要实例(比如java中的静态方法),这样我就可以调用B.funct()并且B类的实例类似于工厂方法,对于扩展A的其他类,例如调用X.funct将返回实例班X

我试图从函数定义中删除泛型类型,除了函数的返回类型,只是将它保留在特征定义中(如def funct(): T),但这也不起作用。

我是 Scala 的新手,所以如果您能为傻瓜解释它并避免复杂的 scala唯一概念,我将不胜感激

1 个答案:

答案 0 :(得分:2)

简单地说:

trait A
class B(someParameter: String) extends A

trait MyTrait[T <: A] {
    def otherFunct: String //Parentheses on parameterless methods with no side effects and no serious computation are generally unidiomatic in Scala 
    def funct: T //Note, no generic parameter on this method
}

object B extends MyTrait[B] {
    def otherFunct = "Hello"
    def funct = new B("hi")
}

然后:

B.funct //returns a new `B`

apply方法通常用于此工厂样式(例如Seq.apply(),相当于Seq()