Что я хотел бы сделать, это определить условия для классов, включая наследование. Если два условия и-ed (или--ed), результатом должно быть условие более конкретного класса, то есть условия запроса.
Так что, если у меня есть
class Parent
class Sub extends Parent
class SubSub extends Sub
a Condition[Sub] and Condition[Parent] and Condition[SubSub]
должно дать Condition[SubSub]
.
Условия также должны быть контравариантными, поскольку условие над родителем также должно быть условием над подпрограммой. Таким образом, я определил (AnyRef - дополнительное внешнее ограничение):
class Condition[-A<:AnyRef] {
def and[R<:A, P>:R<:AnyRef](that:Condition[P]):Condition[R]=
new AndCondition[R](this, that)
}
class AndCondition[-A<:AnyRef](left:Condition[_>:A], right:Condition[_>:A])
extends Condition[A]
Ввод AndCondition вроде бы в порядке, так как это
val a:AndCondition[SubSub] =
new AndCondition(
new AndCondition(
new AndCondition(
new Condition[Parent],
new Condition[Sub]),
new Condition[Parent]),
new Condition[SubSub])
работает. У меня были проблемы с методом и для вызовов инфикса, и я пришел к приведенному выше определению, которое также работает:
val b: Condition[SubSub] =
new Condition[Parent] and
new Condition[SubSub] and
new Condition[Sub]
... вроде, так как он перестает работать при выполнении четвертого условия:
val c: Condition[SubSub]=
new Condition[Parent] and
new Condition[SubSub] and
new Condition[Sub] and
new Condition[Parent]
приводит к выводу 'Nothing':
error: inferred type arguments
[com.solvedirect.test.SubSub,com.solvedirect.test.SubSub,com.solvedirect.test.Parent]
do not conform to method and's type parameter bounds
[R <: Nothing,R <: R,P >: R <: AnyRef]
"Уменьшение" и "цепочки" путем связывания воедино первого и второго двух условий (то есть (a и b) и (c и d)) заставляет его снова компилироваться
Думаю, я выбрал неправильный маршрут, но не вижу его. Прошу прощения за неопределенный заголовок вопроса или если на него уже был дан ответ, но я не смог его найти, возможно, также из-за отсутствия описательных поисковых терминов.
Спасибо за ваше время.
С уважением,
Месси