Чтобы проиллюстрировать мою точку зрения, вот пример:
abstract class Wrapper[A](wrapped: A) {
protected def someCondition: Boolean
def fold[B](whenTrue: => B)(whenFalse: => B): B =
if (someCondition) whenTrue else whenFalse
}
Я пытаюсь добавить метод fold
, основанный на произвольном условии, определенном для упакованного типа A
.Проблема с кодом выше состоит в том, что он не будет компилироваться, хотя он может возвращать Any
:
wrapper.fold("hi")(42)
, потому что к тому времени, когда компилятор достигает второго списка параметров, B
уже былПредполагается, что String
.Предположим, мы не хотим писать аннотацию типа.Мы можем попытаться изменить fold
на это:
def fold[B, B0 >: B](whenTrue: => B)(whenFalse: => B0): B0
, но этот также не работает, поскольку B0
уже был разрешен как String
в концепервый список параметров, хотя он вообще не отображается!Простое решение, конечно, состоит в том, чтобы иметь один список параметров, но для примера, скажем, я хочу сохранить два списка параметров и попытаться заставить его работать ... В идеале, мы должны иметь возможность задержка разрешение B0
.Было бы здорово, если бы мы могли написать что-то вроде этого:
def fold[B](whenTrue: => B)[B0 >: B](whenFalse: => B0): B0
Но, к сожалению, это не работает.Есть ли какие-нибудь обходные пути?
(я даю первый ответ, но я, конечно, ищу и другие обходные пути).