gpt4 book ai didi

java 方法接受一个 T extends Number

转载 作者:搜寻专家 更新时间:2023-11-01 02:00:54 25 4
gpt4 key购买 nike

我有点生疏,陷入了某种基本问题。我希望我的方法 printBinary 接受一个 LongInteger。并根据输入类型调用相应对象的 toBinaryString() 方法。

现在我知道有方法重载等替代方法,我可以创建两个方法都调用 printBinary 但一个采用 Long ,另一个采用 Integer。但是,如果我想用一种方法做到这一点,我该如何实现呢?

public static <T extends Object> void print(T arg){
System.out.println(arg);
}

public static <T extends Number> void printBinary(T arg){
if(arg instanceof Long){
print(Long.toBinaryString(arg)); //this throws an error incompatible types: Number cannot be converted to long

}else{
print(Integer.toBinaryString(arg)); //this throws an error incompatible types: Number cannot be converted to int

}
}

最佳答案

解释

你写的

public static <T extends Number> void printBinary(T arg)

所以你声明了T成为延伸Number的东西.非常重要,请注意关于 T 的信息一无所知。 .所以你只能安全地假设它是 Number但仅此而已(不检查,例如使用 instanceof )。

接下来就是你写

// requires long
print(Long.toBinaryString(arg));
// requires int
print(Integer.toBinaryString(arg));

但这两种方法都不需要 Number , 他们需要 longint .查看他们的文档(LongInteger)。

即使我们考虑装箱,Java 也只能转换Long。进入longInteger进入int (或相反亦然)。但不是NumberLongNumberInteger . Number不一定是 LongInteger .例如,它也可以是 Double .你不知道什么T是,你只知道它至少是 Number 类型.


实用方法

所以您需要做的是显式转换 arglongint .因此,您可以使用 Number 提供的实用方法, 即 Number#longValueNumber#intValue :

print(Long.toBinaryString(arg.longValue()));
print(Integer.toBinaryString(arg.intValue()));

instanceof 之后转换

另一种可能是施放它们。正如您检查过的 instanceofT真正的类型是 LongInteger你可以安全地转换它:

print(Long.toBinaryString((Long) arg));
print(Integer.toBinaryString((Integer) arg));

转换后Java会自动转换LonglongIntegerint ,这称为拆箱。或者更明确一点,自己调用开箱方法:

print(Long.toBinaryString(((Long) arg).longValue()));
print(Integer.toBinaryString(((Integer) arg).intValue()));

注意事项

准确地说是转换为Integer使用您当前的代码未选中。您还需要检查 arg instanceof Integer ,因此更安全:

if (arg instanceof Long) {
// Cast to Long is safe
} else if (arg instanceof Integer) {
// Cast to Integer is safe
} else {
// Neither Long nor Integer, for example Double
throw new IllegalArgumentException("Only Long and Integer supported.");
}

关于java 方法接受一个 T extends Number,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47743382/

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