【问题标题】:Generic type conversion error泛型类型转换错误
【发布时间】:2016-01-21 17:17:00
【问题描述】:

我正在尝试创建一个可以接受许多基本类型(byte、int、float、long、double 或 short)的方法。然后在某个检查方法之后,要么返回相同的数字(例如,它接受双精度并返回双精度),要么返回零。

到目前为止,我已经做到了:

<AnyNumType> AnyNumType cancelAdd(AnyNumType val, String point) {
    if (checkModuleMatchAndOff(point) == true) return 0;
    else return val;
}

但我收到类型不匹配错误(带有下划线并解释为 0:“无法从 int 转换为 AnyNumType”)。有没有办法解决这个零问题?我打算在方程式中使用这种方法,所以我真的需要它来返回原始类型。

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

【问题讨论】:

  • 泛型不能使用原始类型(如intfloat)。您需要为您希望支持的每种原始类型创建专用方法。

标签: java generics


【解决方案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;
}

其他原始类型的重载看起来非常相似。

【讨论】:

    【解决方案2】:

    您可以将方法类型更改为:

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

    【讨论】:

      猜你喜欢
      • 2018-12-17
      • 2013-05-14
      • 1970-01-01
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      相关资源
      最近更新 更多