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

标签 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: incompatible types required: java.lang.Long found: java.lang.Object

正在通过使用手动转换来解决:

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

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

最佳答案

您尚未正确实例化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 .

关于 java 。泛型类中的方法总是返回 Object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25012509/

相关文章:

java - 获取List中元素的类型

Swift泛型函数根据泛型类型调用底层方法

java - 从单个构造函数参数推断泛型类类型参数

java - 如何将变量从 try 传递到 action 事件?

generics - 使用包含 std_logic 的泛型在 Verilog 中实例化 VHDL

Scala:泛型和隐式

java - 我的 MainActivity.java 无缘无故出现错误

java - Neo4J批量创建关系

java - Spring 4 MVC 和 Websockets - 没有合适的默认 RequestUpgradeStrategy

java - 模拟 jdbc 数据源时遇到的困难