2011-11-20 20 views
1

我试图实现add方法中提到的符合found java.lang.Integer Required Tin the Generic sparse matrix addition questionJava的泛型此外

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

的编译器错误,我返回一个新的整数。我不确定自从T扩展Number并且Integer是Number的子类后我缺少的。

+0

'Cat'扩展'Animal','Dog'是'Animal'的一个子类。这并不意味着你可以返回一个'狗',其中预计有'猫'。 –

+0

@OliCharlesworth我已经尝试过铸造到T,但是这似乎没有帮助 –

+0

@NuclearGhost:这给了什么错误? – SLaks

回答

4

编译器不会让你这样做,因为T可能是其他一些类,如Double
你知道TInteger检查instanceof检查,但编译器没有。

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);调用它显然是错误的。

+0

啊,是的,这是正确的。仅仅因为它们延伸相同的东西并不能使它们相同。 –

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

包装泛型;

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()); 
     } 
    } 
+0

你不应该在没有任何解释的情况下发布代码,它可以或应该如何解决问题。顺便说一句,你也不应该在代码中添加@SuppressWarnings(“unchecked”)',因为你故意这样做。另一件事:你的代码对于异常非常脆弱。 – Tom