Scala返回类型等于参数类型

时间:2017-04-25 18:58:45

标签: scala

我想为静态方法(即没有F-Bounded多态)提供下面描述的功能,但到目前为止我还没有。我非常感谢您的意见。

假设我们有以下类层次结构:

sealed trait A
case class B(value: Int) extends A
case class C(value: Int) extends A

如果我尝试执行以下操作,编译器会抱怨:

def doSomething[T <: A](arg1: T, arg2: Any, ...): T = {
  arg1 match {
    case b: B => B(5)
    case c: C => C(5)
  }
}

有没有办法实现这个功能?

谢谢!

1 个答案:

答案 0 :(得分:0)

  1. 不,使用此类层次结构无法表达它。

  2. def doSomething[T <: A](arg1: T, arg2: Any, ...): T = arg1中{<1}}的一般强制转换错误或抛出异常的唯一可能实现是.asInstanceOf[T]。通常&#34;一般不正确&#34;我的意思是在最后添加import { Component, OnInit, OnDestroy } from '@angular/core'; import { Subscription } from 'rxjs/Subscription' import { Events } from '../shared/messages/events'; import { MessageService } from '../shared/messages/message.service'; export class Component implements OnInit, OnDestroy { public icon: string; private subscription: Subscription; constructor() { this.btnClickSubscribe();} private btnClickSubscribe(): void { this.subscription = this.messageService .subscribe(Events.btnClick, (payload) => { this.icon = 'fa-trash-o'; console.log(this.icon) //logs the correct value, 'fa-trash-o' //but it's only available inside this context. I need it in the //class context }); } 会使它编译,但是会有一些程序不应该进行类型检查。

  3. 发明了F-Bounded多态性来解决这个问题。任何其他解决方案都将等同或更糟。