【问题标题】:Java | Using Generics to Reduce Code Duplication爪哇 |使用泛型减少代码重复
【发布时间】:2020-08-31 05:21:28
【问题描述】:

我一直在尝试编写一个简单但灵活的类,它包含一些泛型类型 T 的值。 T 扩展了 Number,这意味着我只想让这个类处理从字节到长整型的所有内容。 我对如何使用泛型不是很熟悉,所以我向你们提出的主要问题是,是否有办法将以下一组函数缩短为一个函数,以减少不必要的代码重复。以下是给定的代码:

    public static byte distanceSq(byte x1, byte y1, byte x2, byte y2) {
        x1 -= x2;
        y1 -= y2;
        return (byte) (x1 * x1 + y1 * y1);
    }
    
    public static short distanceSq(short x1, short y1, short x2, short y2) {
        x1 -= x2;
        y1 -= y2;
        return (short) (x1 * x1 + y1 * y1);
    }
    
    public static int distanceSq(int x1, int y1, int x2, int y2) {
        x1 -= x2;
        y1 -= y2;
        return (int) (x1 * x1 + y1 * y1);
    }
    
    public static float distanceSq(float x1, float y1, float x2, float y2) {
        x1 -= x2;
        y1 -= y2;
        return (float) (x1 * x1 + y1 * y1);
    }
    
    public static double distanceSq(double x1, double y1, double x2, double y2) {
        x1 -= x2;
        y1 -= y2;
        return (double) (x1 * x1 + y1 * y1);
    }
    
    public static long distanceSq(long x1, long y1, long x2, long y2) {
        x1 -= x2;
        y1 -= y2;
        return (long) (x1 * x1 + y1 * y1);
    }

我试图写一些类似的东西:

    public static <U extends Number> U distanceSq(U x1, U y1, U x2, U y2) {
        x1 -= x2;
        y1 -= y2;
        return (x1 * x1 + y1 * y1);
    }

但是,由于变量现在是对象,操作员无法解析它们。我尝试使用 instanceof 语句将它们转换为适当的包装器,但这也让我无处可去。

【问题讨论】:

标签: java generics code-duplication


【解决方案1】:

你可以这样定义你的方法

public static  <T extends Number> Number distanceSq(T x1,T y1,T x2,T y2){
    double x = x1.doubleValue() - x2.doubleValue();
    double y = y1.doubleValue() - y2.doubleValue();
    return (x * x + y * y);
}

也可以称为

Integer r1 = distanceSq(a1, b1, a2, b2).intValue();
Byte r2 = distanceSq(x1, y1, x2, y2).byteValue();

【讨论】:

  • 感谢您的帮助,但似乎它会导致 long 被截断或四舍五入。据我所知,java 没有 C++ 模板那么方便。我将不得不复制不同类型的代码以避免实例化原始包装器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多