gpt4 book ai didi

java - 使用泛型删除未经检查的转换警告

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:38:08 26 4
gpt4 key购买 nike

我刚开始接触 Java 的泛型,所以我为自己建立了一个小项目。我想制作一个 vector/点,您可以在其中指定 Number(例如 DoubleIntegerLong、等)。

我最终得到了一个不错的类对象,但是我注意到了一些关于方法的问题。

import java.math.BigDecimal;

@SuppressWarnings("WeakerAccess") // Suppresses weaker access warnings
public class Vector<T extends Number> {

private T x;
private T y;

public Vector() {}

public Vector(T x, T y) {
this.x = x;
this.y = y;
}

public T getX() {
return x;
}

public void setX(T x) {
this.x = x;
}

public T getY() {
return y;
}

public void setY(T y) {
this.y = y;
}

public void dislocate(T offsetX, T offsetY) {
this.setX(addNumbers(getX(), offsetX));
this.setY(addNumbers(getY(), offsetY));
}

public void dislocate(Vector vector) {
this.setX(addNumbers(getX(), vector.getX()));
this.setY(addNumbers(getY(), vector.getY()));
}

@SuppressWarnings("unchecked") // Suppresses cast unchecked warnings
private T addNumbers(Number... numbers) {
BigDecimal bd = new BigDecimal(0);

for(Number number : numbers) {
bd = bd.add(new BigDecimal(number.toString()));
}

return (T) bd;
}
}

最后一个方法,即加法,会抛出一个未经检查的转换警告。在我做了一些研究之后,我发现它由于泛型而表现得很奇怪,我对泛型还比较陌生,无法正确排除故障。

return (T) bd; 会产生警告吗? T 必须是 Number 的实例,所以它应该可以转换为 BigDecimal,对吗?

所以我创建了我的小测试方法,

Vector<Double> vec = new Vector<>(1.0, 3.0);
Vector<Double> vec2 = new Vector<>(2.2, 3.9);
vec.dislocate(1.0, 2.7);
System.out.println(vec.getX() + " " + vec.getY());
vec.dislocate(vec2);
System.out.println(vec.getX() + " " + vec.getY());

效果很好,打印出 2.0 5.74.2 9.6

接下来的问题是,当我使用 Double 中的方法时,例如 Double#isNaN()。然后抛出 ClassCastException,Exception in thread "main"java.lang.ClassCastException: java.base/java.math.BigDecimal cannot be cast to java.base/java.lang.Double.

这似乎与人们遇到的其他问题很常见,但是,尽管查看了资源,我还是不明白为什么使用 Double 方法。转换后对象应该是 Double,对吗?

最佳答案

你基本上不能在 Java 中做这样的事情。当且仅当 T 是一个 BigDecimal 本身时,(T) someBigDecimal 才会起作用。删除的工作方式可能会暂时向您隐藏这一点,但是 Number 没有关于能够将两个数字相加或将一个数字转换为另一个数字的特殊魔力。

一般来说,在 Java 中,实际上没有什么任何方法可以对不同种类的数字进行泛化,然后能够用它们进行数值运算。

关于java - 使用泛型删除未经检查的转换警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52019873/

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