如何编写我的课程以接受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.
}
有关如何编程我的类以完全接受浮点数,整数和双精度的任何想法吗?
答案 0 :(得分:1)
目前,我们不能对int
或double
这样的原语进行泛型,因此您将被迫使用盒装表示。为int
和double
创建单独的课程确实更容易。但是如果你想使用泛型,那么你可以用类型安全的方式(使用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}使用创建addX
和addY
方法很容易。像,
long
答案 3 :(得分:-1)
浮动和整数是非常不同的值,具有非常不同的分钟和最大值。我会尝试使用双精度作为数据成员,为不同的变量类型而不是泛型的重载构造函数,除非真的需要泛型。
答案 4 :(得分:-1)
是的,您可以使用泛型并创建类型为T的x和y属性。
但是你无法以你想要的方式实现addX和addY。
检查有关如何实施通用数字添加的其他答案,它不是那么简单,但你应该能够这样做。
答案 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)没有。
总的来说,在可能的情况下,泛型是一种比继承更简单,更清晰的方式。