通用类型转换错误

时间:2016-01-21 17:17:01

标签: java generics

我试图创建一个接受许多基本类型(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;)。有没有办法解决这个零问题?我打算在方程中使用这个方法,所以我真的需要它来返回原始类型。

编辑:非常感谢你的所有回复,伙计们!

2 个答案:

答案 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);
    }
}