- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的 Java 应用程序中,我创建了返回 Either<String, T>
的方法。对象。
这是因为在某些地方,我调用这些方法作为(第 3 方)方法的参数,这些方法需要 String 参数作为输入。而在其他地方,我调用这些方法作为(第 3 方)方法的参数,这些方法需要一些其他参数类型 (T) 作为输入。
因此,根据我调用创建的方法的位置,代码如下所示:
their.thirdPartyExpectsString(my.calculateEither().getLeft());
their.thirdPartyExpectsString(my.calculateEither() + "");
或
their.thirdPartyExpectsDouble(my.calculateEither().getRight());
(我将 Either.toString()
定义为 Either.getLeft()
)。
请注意,我无法更改第 3 方代码(无论如何,没有字节码操作),并且我想保留我返回 Either
的设计。从我的方法来看。
有没有办法简化我的代码并使其看起来像
their.thirdPartyExpectsString(my.calculateEither());
their.thirdPartyExpectsDouble(my.calculateEither());
即,不必添加 getLeft()/getRight()
或+ ""
一直吗?
事实上,如果我必须这样做,我并不会太困扰
their.thirdPartyExpectsDouble(my.calculateEither().getRight());
因为我不需要经常这样做。但我想摆脱调用getLeft()
的需要或+ ""
当my.calculateEither()
返回 Left
(一个字符串)。
给定 either
,不难看出是否代表Right
或Left
,只需检查哪一侧有 null
.
但是问题出在类型转换上,即 thirdPartyExpectsString()
时编译错误预计 String
但得到 Either
.
我能够捕获 my.calculateEither()
的返回值由 AspectJ 提供,但我看不到如何使用类似 @AfterReturning
的方法建议让编译器明白我想返回 my.calculateEither().getLeft()
,即 String
....
有什么想法吗?
最佳答案
将以下方法添加到 Either
类的实现中:
@SuppressWarnings("unchecked")
public <T> T whichever() {
return (T) (isLeft() ? getLeft() : getRight());
}
请注意,我故意忽略有关未经检查的强制转换的警告,如果您在与您交互的外部 API 需要 left 的地方使用它,确实会导致 ClassCastException
值,但您在包含 right 值的 Either
实例上调用它。此方法将根据您使用它的位置进行隐式转换。它将转换为 T 类型,您可以将其传递给另一个需要 T 类型参数的方法,或者您尝试将该方法返回值分配给 T 类型的变量。
以下演示代码:
Either<String, Double> containsString = Either.<String, Double>left("first");
Either<String, Double> containsDouble = Either.<String, Double>right(2d);
their.expectsString(containsString.whichever());
their.expectsDouble(containsDouble.whichever());
their.expectsDouble(containsString.whichever());
将在第一次调用中正常工作,并在第三次调用中导致 ClassCastException
,这正是我们所期望的,因为我们认为它是非法用例。
总之,很高兴知道它可以在我们隐式转换到的 T 类型可分配给 Either
对象包含的实际值的所有地方工作。不幸的是,如果情况并非如此,您只能在运行时发现。
关于Java:隐式类型转换,或隐式 toString() 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35953155/
我是一名优秀的程序员,十分优秀!