我有 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();
}
原始Set
与 Set<Object>
相同这解释了为什么编译器强制您进行强制转换。
有关更多详细信息,请参阅the documentation on raw types .
关于 java 。泛型类中的方法总是返回 Object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25012509/