Чтобы понять причину, по которой ваш код не компилируется, обратите внимание на то, что Java использует java.lang.Boolean
для буферизованного типа с буфером, а Scala использует scala.Boolean
. В большинстве случаев, когда вы хотите использовать один из них, а метод возвращает другой (или аргумент метода требует другого), будет выполняться неявное преобразование, и будет использоваться правильный тип.
Метод a
, который вы написали в Scala, действительно возвращает A[java.lang.Boolean]
. Поскольку нет никакого неявного преобразования между A[java.lang.Boolean]
и A[scala.Boolean]
, он не будет автоматически возвращать A[scala.Boolean]
в этом случае.
Чтобы убедиться, что это так, то мы можем видеть, что этот метод компилируется без проблем:
def a: A[java.lang.Boolean] = new AT()
Вновь подтвердить точку, потому что мы не имеем неявное преобразование, это также не будет работать (вы увидите, как это может быть исправлено ниже):
val instanceOfA: A[Boolean] = a
def a = new AT()
// Error: AT doesn't conform to A[Boolean]
чтобы это исправить, можно неявно преобразовать к нужному типу литьем его:
implicit def toScalaABoolean(a: A[java.lang.Boolean]): A[Boolean] =
a.asInstanceOf[A[Boolean]]
Сделав это, вы не должны даже объявить тип возвращаемого a
метода больше:
implicit def toDifferentBoolean(a: A[java.lang.Boolean]): A[Boolean] =
a.asInstanceOf[A[Boolean]]
val instanceOfA: A[Boolean] = a
def a = new AT()