我试图创建一个接受许多基本类型(byte,int,float,long,double或short)的方法。然后在某个检查方法之后返回那个非常相同的数字(例如,它接受double并返回double)或者返回零。
到目前为止,我已经达到了这个目标:
<AnyNumType> AnyNumType cancelAdd(AnyNumType val, String point) {
if (checkModuleMatchAndOff(point) == true) return 0;
else return val;
}
但是我得到了一个类型不匹配错误(0加下划线并解释:&#34;无法从int转换为AnyNumType&#34;)。有没有办法解决这个零问题?我打算在方程中使用这个方法,所以我真的需要它来返回原始类型。
编辑:非常感谢你的所有回复,伙计们!
答案 0 :(得分:1)
不,你不接受任何原始类型;你接受任何对象类型。您可能认为自己接受了原始类型,但Java泛型只能使用引用类型。传递给此方法时,您的值将被加框。您可以String
传递val
。
这应该表明为什么0
无法转换为AnyNumType
- AnyNumType
可以是任何引用类型。
接受任何基本类型的最佳方法是为每个基本类型提供重载,例如many methods in the core library do。您可以在每次重载中返回等效的0
,例如
byte cancelAdd(byte val, String point)
{
if (checkModuleMatchAndOff(point) == true) return (byte) 0;
else return val;
}
其他原始类型的重载看起来非常相似。
答案 1 :(得分:0)
您可以将方法类型更改为:
<AnyNumType extends Number> AnyNumType cancelAdd(AnyNumType val, String point);
我不确切地知道你想在方法中做什么,但这应该允许你通过自动装箱传递原语。
但是通常不可能在Java中使用泛型作为原始类型,我认为自动装箱是唯一的方法。
可能会返回一个除了你进入的对象以外的值,但不幸的是,你需要一些丑陋的反思和演员表。它不会支持所有可能的类型。
(也许这个地方有一些图书馆?)
对于那里的任何怀疑者,这里的示例代码是从Eclipse中创建的,没有编译错误,这证明了这一点:
public class NumberGenerix {
@SuppressWarnings("unchecked")
public static <Any extends Number> Any f(Any x) {
Class<?> k = x.getClass();
if (k == Integer.class) {
return (Any) Integer.valueOf(0);
} else if (k == Double.class) {
return (Any) Double.valueOf(0.0);
} else if (k == Long.class) {
return (Any) Long.valueOf(0L);
} else {
// and so on.
throw new RuntimeException("unsupported number type: " + k);
}
}
public static void main(String...args) {
Integer a = f(42);
System.out.println("a == " + a);
Long b = f(42L);
System.out.println("b == " + b);
Double c = f(42.0);
System.out.println("c == " + c);
}
}