当返回类型是上限时,为什么需要强制转换?

时间:2016-07-13 02:25:53

标签: scala

我正在编写一个具有参数化类型T且具有上限的类。该类有一个返回类型为T的方法:

import java.time.temporal.{ Temporal, TemporalAmount }
implicit class RichTemporal[T <: Temporal](t: T) {
  def + (amount: TemporalAmount): T = t.plus(amount)    // error: type mismatch
}

以上不编译;编译器抱怨类型不匹配:

[error] type mismatch;
[error] found   : java.time.temporal.Temporal
[error] required: T

该代码仅在我明确调用asInstanceOf[T]时才有效,如下所示。

import java.time.temporal.{ Temporal, TemporalAmount }
implicit class RichTemporal[T <: Temporal](t: T) {
  def + (amount: TemporalAmount): T = t.plus(amount).asInstanceOf[T]
}

但为什么会这样呢?我的第一个猜测是编译器可能不知道TTemporal更具体,因此调用t.plus(amount)实际上是对Temporal#plus的调用,它返回{ {1}},但调用Temporal清楚地表明编译器确实知道asInstanceOf[T]的特定类型。

采用不同的路径,为什么编译器不知道调用T是动态绑定的,因此返回类型t.plus(amount)

1 个答案:

答案 0 :(得分:0)

  

采用不同的路径,为什么编译器不知道调用t.plus(amount)是为了动态绑定,从而返回类型T?

因为它当然不必返回T

class MyTemporal extends Temporal {
  def plus(amount: TemporalAmount): Temporal = Instant.now()
  // other methods
}

是完全合法的实施。