Java:隐式类型转换,或隐式 toString() 调用

标签 java scala aspectj spring-aop implicit-conversion

在我的 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 ,不难看出是否代表RightLeft ,只需检查哪一侧有 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/

相关文章:

java - 当创建 JDialog 并将模式设置为 true 时,我的线程似乎永远锁定?

java - 当我用逗号或点分隔小数时,扫描会加倍

java - 反序列化类似 XML 的响应

scala - 如何使用映射将数据框保存到Elasticsearch

java - 围绕 Spring-AOP 切入点和继承的澄清

java - 等差数列中的前 1,000 个数 1, 4, 7, 10

scala - 迭代 Option 实例,直到找到第一个非空实例

scala - 将列表[Either[A, B]] 转换为Either[List[A], List[B]]

java - 使用 AspectJ spring-aop 改变返回值的类型

java - Spring AOP - 为什么我需要 aspectjweaver?