java通用补充

时间:2011-11-20 17:17:29

标签: java generics

我正在尝试实现提到的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扩展以来我缺少什么数字和整数是数字的子类。

4 个答案:

答案 0 :(得分:4)

编译器不允许您这样做,因为T可能是其他类,例如Double
您知道T检查Integerinstanceof,但编译器没有。{/ 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());
      }
    }