Java的。泛型类中的方法总是返回Object

时间:2014-07-29 09:49:57

标签: java generics

我有Matrix抽象类:

public abstract class Matrix<T> implements Cloneable {
  public abstract void set(Long row, Long col, T val);
  public abstract Set<Long> getRows();
  public abstract Set<Long> getCols(Long row);
  public abstract T get(Long row, Long col);
  ..

这是实施的一部分:

public class SparseMatrix<T> extends Matrix<T> {
  private Map<Long, Map<Long, T>> matrix = new HashMap<Long, Map<Long, T>>();
  private Size size;
  T notObservedValue = null;

  public SparseMatrix(Size size){
      this.size = size;
  }

  public void setNotObservedValue(T value){
      notObservedValue = value;
  }
  @Override
  public void set(Long row, Long col, T val){
    if( matrix.containsKey(row) )
        matrix.get(row).put(col, val);
    else{
        Map<Long, T> cols = new HashMap<Long, T>();
        cols.put(col, val);
        matrix.put(row, cols);
    }
  }

  @Override
  public Set<Long> getRows(){
      return matrix.keySet();
  }
  @Override
  public Set<Long> getCols(Long row){
      return matrix.get(row).keySet();
  }

  @Override
  public T get(Long row, Long col){
     Map<Long, T> r = matrix.get(row);
    if(r != null){
        T result = r.get(col);
        if(result == null)
            return notObservedValue;
        return result;
    }
    return notObservedValue;
  }

当我尝试迭代稀疏矩阵中的每个值时,此代码不起作用:

  for(Long row : matrix.getRows()){
     for(Long col : matrix.getCols(row)){
        continue;
     }
  }

错误是

  

java:不兼容的类型     必需:java.lang.Long     发现:java.lang.Object

通过使用手动铸造来解决:

for(Long row : (Set<Long>)matrix.getRows()){
  for(Long col : (Set<Long>)matrix.getCols(row)){
    continue;
  }
}

但我不明白,为什么返回值类型是Object?它不是泛型方法,此方法在Matrix抽象类和SparseMatrix实现中声明为Set getRows()。

1 个答案:

答案 0 :(得分:4)

您尚未实例化正确 matrix对象。它必须是(例如):

SparseMatrix<Double> matrix = new SparseMatrix<Double>(new Size(3, 2));

原因是当您使用原始类型实例化对象时,所有通用信息都将被删除(这意味着代码中的每个通用部分都将被其原始变体替换)。因此,当您执行SparseMatrix matrix = ...时,泛型方法将被转换(例如)到:

@Override
public Set getRows(){
    return matrix.keySet();
}
@Override
public Set getCols(Long row){
    return matrix.get(row).keySet();
}

原始SetSet<Object>相同,这解释了编译器强迫您进行强制转换的原因。

有关详细信息,请参阅the documentation on raw types