Чтобы проиллюстрировать мою точку зрения, вот пример:
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
Но, к сожалению, это не работает. Есть ли обходные пути?
(Я даю первый ответ, но я, конечно, ищу и другие обходные пути.)