在Scala中,是否有方法指定返回类型应与方法调用方的类型匹配?

在Scala中,是否有方法指定返回类型应与方法调用方的类型匹配?,scala,inheritance,types,Scala,Inheritance,Types,例如,我有一个名为Foo的类 abstract class Foo { def f(): ??? = { ... } } class Bar extends Foo { ... } class Baz extends Foo { ... } 我想要的是一种方法,当f被Bar调用时返回一个Bar,当它被Baz调用时返回一个Baz。Bar和Baz都有相同的构造函数,所以f中的代码在这两次都是相同的,除了我是说new Bar(…)还是new Baz(…)。有并没有办法说新类型

例如,我有一个名为Foo的类

abstract class Foo {
    def f(): ??? = { ... }
}
class Bar extends Foo {
    ...
}
class Baz extends Foo {
    ...
}

我想要的是一种方法,当f被Bar调用时返回一个Bar,当它被Baz调用时返回一个Baz。Bar和Baz都有相同的构造函数,所以f中的代码在这两次都是相同的,除了我是说new Bar(…)还是new Baz(…)。有并没有办法说新类型的wheeverclassiscalingme(…)

假设您想要调用该方法的具体子类的类型(我不会将其称为“方法调用方的类型”,而是“被调用方的类型”),您可以这样做

def f(): this.type = ???

听起来你想要F-有界类型。但是,您仍然需要为所有子类实现它,因为父类不知道子构造函数(“哺乳动物”不知道如何生成“猫”)


抽象类Foo[T Related:你真的想返回
新SameAsThis()
还是只返回
这个
?如果是前者,我认为你需要一些抽象工厂方法,并为所有子类实现它。不,那是不对的。
这个。type
只允许返回
这个
,而不允许返回具体子类的任何实例。
abstract class Foo[T <: Foo[T]] {
    def createMe(): T
}

class Bar extends Foo[Bar] {
    override def createMe() = new Bar
}

class Baz extends Foo[Baz] {
    override def createMe() = new Baz
}