gpt4 book ai didi

Java 泛型 - 为什么 new Money(4.0) === new Money(4.0) 相等?

转载 作者:行者123 更新时间:2023-12-01 17:43:39 27 4
gpt4 key购买 nike

为什么是assertNotEquals(new Money<Dollar>(4.0), new Money<Franc>(4.0));相等吗?

此测试失败。

我真的不明白为什么这个断言不成功。

是因为assertNotEquals匹配Money的父类(super class)吗?根据我的理解,这两个内联实例化应该是两种不同的类型。

我认为当你用 Scala 实现这个时就是这样。

但我不明白这里发生了什么。这是 JVM 特有的问题吗?货币.java:

public class Currency {

private final String shortcut;

public Currency(String shortcut) {
this.shortcut = shortcut;
}

public String getShortcut() {
return shortcut;
}
}

Dollar.java(与 Franc.java 类似)

public class Dollar extends Currency {
public Dollar() {
super("USD");
}
}

汇率.java

@Value // lombok
public class ExchangeRate<C extends Currency, TargetC extends Currency> {

Double rate;

}

Money.java

@Value
public class Money<C extends Currency> {

private final Double amount;

public final <TargetC extends Currency> Money<TargetC> exchange(ExchangeRate<C, TargetC> rate) {
return new Money<TargetC>(amount * rate.getRate());
}

}

最佳答案

泛型类型会在运行时被删除。

运行时无法判断 Money 对象是 Money<Dollar> 还是 Money<Franc> 。它们看起来都像 Money

那么,如果不是货币,那么您的 Money 对象在运行时实际拥有什么数据呢?好吧,只有 amount 。只能比较 amount 的值,因为丢失了 Dollar 还是 Franc 的信息。在本例中,金额都是 4.0 ,因此就运行时而言,它们被认为是相等的。

为了使测试成功,您可以存储一个额外的 Class<?> 字段:

@Value
public class Money<C extends Currency> {

private final Double amount;
private final Class<C> currencyClass;
}

当您创建 Money 时,您将被迫传递货币类别:

new Money(4.0, Dollar.class)

关于Java 泛型 - 为什么 new Money<Dollar>(4.0) === new Money<Franc>(4.0) 相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57952767/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com