我正在尝试实现提到的in the Generic sparse matrix addition question
添加方法class Matrix<T extends Number>
{
private T add(T left, T right)
{
if (left instanceof Integer)
{
return new Integer(((Integer)left).intValue() + ((Integer)right).intValue());
}
}
编译器在返回新Integer的行中出现found java.lang.Integer Required T
错误。我不确定自从T扩展以来我缺少什么数字和整数是数字的子类。
答案 0 :(得分:4)
编译器不允许您这样做,因为T
可能是其他类,例如Double
。
您知道T
检查Integer
为instanceof
,但编译器没有。{/ p>
答案 1 :(得分:2)
Java的类型系统根本无法表达这一点。这是一个解决方法。
创建一个接口Numeric
,提供您感兴趣的数字操作,并为您感兴趣的数据类型编写实现。
interface Numeric<N> {
public N add(N n1, N n2);
public N subtract(N n1, N n2);
// etc.
}
class IntNumeric extends Numeric<Integer> {
public static final Numeric<Integer> INSTANCE = new IntNumeric();
private IntNumeric() {
}
public Integer add(Integer a, Integer b) {
return a + b;
}
public Integer subtract(Integer a, Integer b) {
return a - b;
}
// etc.
}
并重写您的Matrix
类构造函数以接受此实现。
class Matrix<N> {
private final Numeric<N> num;
private final List<List<N>> contents;
public Matrix(Numeric<N> num) {
this.num = num;
this.contents = /* Initialization code */;
}
public Matrix<N> add(Matrix<N> that) {
Matrix<N> out = new Matrix<N>(num);
for( ... ) {
for( ... ) {
out.contents.get(i).set(j,
num.add(
this.contents.get(i).get(j),
that.contents.get(i).get(j),
)
);
}
}
return out;
}
}
// Use site
Matrix<Integer> m = new Matrix<Integer>(IntNumeric.INSTANCE);
希望有所帮助。
答案 2 :(得分:0)
“我不确定我缺少什么,因为T扩展Number和Integer是Number的子类。”
这句话是错误的。一般来说,如果你有:
public class B extends A {
}
public class C extends A {
}
这并不意味着B可以被投射到C.所以写下像:
public <T extends A> T method(T arg) {
return (B)arg;
}
你用B b = (B)method(C);
调用它显然是错误的。
答案 3 :(得分:-2)
包装泛型;
public class Box<T> {
public T j,k;
int l;
float f;
@SuppressWarnings("unchecked")
public void add(T j,T k) {
this.j = j;
this.k=k;
if(j.toString().contains("."))
{
this.f=Float.parseFloat(j.toString())+Float.parseFloat(k.toString());
} else{
this.l=Integer.parseInt(j.toString())+Integer.parseInt(k.toString());
}
}
public int getInt() {
return l;
}
public float getFloat() {
return f;
}
public static void main(String[] args) {
Box<Integer> integerBox = new Box<Integer>();
Box<Float> floatBox = new Box<Float>();
integerBox.add(new Integer(10),new Integer(20));
floatBox.add(new Float(2.2),new Float(3.3));
System.out.printf("Integer Value :%d\n\n", integerBox.getInt());
System.out.printf("float Value :%f\n", floatBox.getFloat());
}
}