如何实现java通用数据结构,避免类型擦除转换问题

myr*_*ipe 1 java generics data-structures

我有以下代码:

public class Matrix<K, V> {
    private final List<K> colKeys;
    private final List<K> rowKeys;
    private final Map<K, Map<K, V>> matrix;

    public Matrix() {
        colKeys = new LinkedList<>();
        rowKeys = new LinkedList<>();
        matrix = new TreeMap<>();
    }

    ...

    public V getCell(K row, K col) {
        return matrix.get(row).get(col);
    }

    ...

}
Run Code Online (Sandbox Code Playgroud)

我像这样在另一个类中访问它:

Matrix matrix = new Matrix<String, Double>();

...

for (String colKey : colKeys) {
    double sum = 0;
    int divider = 0;

    for (String rowKey : rowKeys) {
        if (matrix.containsCell(rowKey, colKey)) {
            sum += (double)matrix.getCell(rowKey, colKey);
            divider++;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我被迫将返回的值转换为getCell(K row, K, col)to,double因为编译器会告诉我它返回a java.lang.Object而没有它.

我很确定这是由于类型擦除.Java有很多使用泛型的数据结构,但不需要转换值.看看其中一些数据结构的实现,我仍然不知道如何解决这个问题.

所以,我的问题是:如何以不需要转换返回值的方式创建实现泛型的数据结构?

Ell*_*sch 5

像这样,

Matrix<String, Double> matrix = new Matrix<String, Double> ();
Run Code Online (Sandbox Code Playgroud)

在Java 7(及更高版本)中,您可以使用菱形运算符缩短它; 像这样,

Matrix<String, Double> matrix = new Matrix<>();
Run Code Online (Sandbox Code Playgroud)