我有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()。
答案 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();
}
原始Set
与Set<Object>
相同,这解释了编译器强迫您进行强制转换的原因。
有关详细信息,请参阅the documentation on raw types。