在Scala中有一种方法可以指定返回类型应该与方法调用者的类型匹配吗?

时间:2016-08-29 23:52:27

标签: scala inheritance types

例如,我有一个名为Foo

的类
at AuthService.js:8
at Object.<anonymous> (AuthService.js:12)
at Object.invoke (angular.js:4570)
at Object.enforcedReturnValue [as $get] (angular.js:4422)
at Object.invoke (angular.js:4570)
at angular.js:4387
at getService (angular.js:4529)
at Object.invoke (angular.js:4561)
at extend.instance (angular.js:9435)
at nodeLinkFn (angular.js:8540)

我想要的是f在Bar调用时返回Bar的方法,以及Baz调用时的Baz。 Bar和Baz都有相同的构造函数,因此f中的代码两次都是相同的,除了我是否要说新的Bar(...)或新的Baz(...)。有没有办法说新的TypeOfWhateverClassIsCallingMe(...)?

2 个答案:

答案 0 :(得分:2)

听起来你想要F-Bounded类型。但是,您仍然必须为所有子类实现它,因为父类不知道子构造函数(“哺乳动物”不知道如何制作“Cat”)。

colorView

这基本上为您提供了编译时的安全性,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 } 的所有子项都需要实现一个创建自己类的东西的方法。

深入讨论here

答案 1 :(得分:1)

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

<?php $this->load->view('header'); ?>
<div class="module_item">
    <?php foreach ($fields as $session) : ?>
        <?php foreach ($session['data'] as $itemData) : ?>
            <div class="module_item" title="<?= $itemData['value'] ?>">
                <a href="<?= $itemData['url'] ?>"><img src="<?= $itemData['icon'] ?>"/></a>
                <a href="<?= $itemData['url'] ?>"><?= $itemData['value']?></a>
            </div>
        <?php endforeach ?>
    <?php endforeach ?>
</div>
相关问题