Java |使用泛型减少代码重复

问题描述

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

    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 语句将它们转换为适当的包装器,但这也使我无处可做。

解决方法

您可以这样定义您的方法

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