Java泛型 - 接受float和int

时间:2015-05-19 01:38:57

标签: java generics

如何编写我的课程以接受Integers和Floats,我想我需要使用泛型,我是否正确?

public class Vec2 {

private int x, y;

public Vec2(int xa, int ya) {
    this.x = xa;
    this.y = ya;
}
public Vec2() {
    this(0, 0);
}
public Vec2(Vec2 vec) {
    this(vec.x, vec.y);
}

public void addX(int xa) {
    x+=xa; // I get an exception here when I try to use generics.
}
public void addY(int ya) {
    y+=ya; // I get an exception here when I try to use generics.
}

有关如何编程我的类以完全接受浮点数,整数和双精度的任何想法吗?

6 个答案:

答案 0 :(得分:1)

目前,我们不能对intdouble这样的原语进行泛型,因此您将被迫使用盒装表示。为intdouble创建单独的课程确实更容易。但是如果你想使用泛型,那么你可以用类型安全的方式(使用java8)来实现它:

public class Vec2<T> {

    private final BinaryOperator<T> adder;

    private T x, y;

    private Vec2(BinaryOperator<T> adder, T x, T y) {
        this.adder = adder;
        this.x = x;
        this.y = y;
    }

    public void addX(T xa) {
        x = adder.apply(x, xa);
    }

    public void addY(T ya) {
        y = adder.apply(y, ya);
    }

    public static Vec2<Integer> ofInt(Integer x, Integer y) {
        return new Vec2<>(Integer::sum, x, y);
    }

    public static Vec2<Double> ofDouble(Double x, Double y) {
        return new Vec2<>(Double::sum, x, y);
    }
}
Vec2<Integer> intvec = Vec2.ofInt(5, 3);
intvec.addX(8);

Vec2<Double> dblvec = Vec2.ofDouble(5.2, 8.9);
dblvec.addY(-.9);

答案 1 :(得分:0)

不,你不是,只是让你的类继承自Number并使用类型检查来确保值是必要的,如果必要的话,例如。

Class IsraelG99sClass {
    Number n;

    public Number add(Number n2) {
        if (n instanceof Integer && n2 instanceof Integer) {
             return new Integer(n.intValue() + n2.intValue());
        } else { 
             return new Double(n.doubleValue() + n2.doubleValue());
        }
    }

    public Number getValue() {
        if ((n instanceof Integer) || (n instanceof Float)) {
              return n;
        } // handle the other case as appropriate
   }
}

答案 2 :(得分:0)

您可以使用r.table("contacts").filter({"Type": "Agent","ContactDescription" : "CONDO"}).hasFields("CorporationName").group("CorporationName").ungroup().orderBy(r.desc('reduction')) 来支持BigDecimal,然后您可以对Vec2和{{1}使用创建addXaddY方法很容易。像,

long

答案 3 :(得分:-1)

浮动和整数是非常不同的值,具有非常不同的分钟和最大值。我会尝试使用双精度作为数据成员,为不同的变量类型而不是泛型的重载构造函数,除非真的需要泛型。

答案 4 :(得分:-1)

是的,您可以使用泛型并创建类型为T的x和y属性。

但是你无法以你想要的方式实现addX和addY。

检查有关如何实施通用数字添加的其他答案,它不是那么简单,但你应该能够这样做。

Java Generics and adding numbers together

how to write a generic method for adding numbers

答案 5 :(得分:-2)

首先,我假设您希望x和y具有不同的(通用)类型。

为此,您需要:

public class Vec2<E extends Number> {

private E x, y;

public Vec2(E xa, E ya) {
    this.x = xa;
    this.y = ya;
}

//Not _easily_ possible with generics, as the compiler has no guarantee that
//zero is an acceptable value. Consider some variation of a Factory pattern,
//but this will work. Note that there is an "officially"-unchecked cast warning.
public Vec2() {
    super();

    final Number zero = 0.0; 
    this.x = (E)zero;
    this.y = (E)zero;
}

public Vec2(Vec2<E> vec) {
    this(vec.x, vec.y);
}

public void addX(E xa) {
    Number c = x.doubleValue() + xa.doubleValue();
    x = (E)c;
}

public void addY(E ya) {
    Number c = y.doubleValue() + ya.doubleValue();
    x = (E)c;
}

这应该运作良好。虽然我鼓励您使用泛型,但请注意,保持数字类型(如int,float或double)作为泛型通常是不可取的,因为它们仅在表面上相似。当你深入研究&#34; +&#34;的操作时,它们根据类型完全不同。您还将在此代码中添加各种未经检查的警告;也许如果我有时间的话,我可以把它们正确地扎根,但这只是回到我对通用数字的警告。

您还会注意到这种语言的一些吸引力,例如(E)zero的工作方式,但(E)(0.0)没有。

总的来说,在可能的情况下,泛型是一种比继承更简单,更清晰的方式。