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

时间:2014-01-31 05:33:37

标签: 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);
    }

    ...

}

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

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++;
        }
    }
}

请注意,我被强制将getCell(K row, K, col)的返回值强制转换为double,因为编译器会告诉我在没有它的情况下返回java.lang.Object

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

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

1 个答案:

答案 0 :(得分:5)

像这样,

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

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

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