假设我有两个接口,A
并且B
. A
有三个已知的实现,A1
,A2
和A3
; B
具有三个对应的具体包装类,B1
,B2
和B3
,使得构造函数B1
接受一个A1
,B2
接受一个A2
,等等。
我有一个返回 an 的方法,Option<A>
我想将它转换为 a Try<Option<B>>
,如果它A
是已知实现之一(或None
),它将与相应的B
实现一起包装为 a Success<B>
,否则它是 a Failure
。我目前拥有的是这样的:
Option<A> myA = getA();
Try<Option<B>> wrapped = Match(myA).of(
Case($Some($(instanceof(A1.class))), a -> Success(Some(B1(a)))),
Case($Some($(instanceof(A2.class))), a -> Success(Some(B2(a)))),
Case($Some($(instanceof(A3.class))), a -> Success(Some(B3(a)))),
Case($None(), a -> Success(None())),
Case($(), Failure(new IllegalArgumentException("Unknown A type: " + myA)))
);
这似乎是不必要的可怕。有什么方法可以让我平面化吗?