首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java泛型和数字

Java泛型和数字
EN

Stack Overflow用户
提问于 2009-05-18 14:02:37
回答 9查看 6.8K关注 0票数 18

为了看看我是否可以清理一些数学代码,主要是矩阵方面的东西,我尝试使用一些Java泛型。我有以下方法:

代码语言:javascript
复制
private <T> T[][] zeroMatrix(int row, int col) {
    T[][] retVal = (T[][])new Object[row][col];
    for(int i = row; i < row; i++) {
        for(int j = col; j < col; j++) {
            retVal[i][j] = 0;
        }
    }
    return retVal;
}

让我头疼的是retVali =0这一行。这一行的目标是用T表示0来初始化数组。我尝试过用它做各种事情:(T在类中定义为T扩展Number)

代码语言:javascript
复制
retVal[i][j] = (T)0;
retVal[i][j] = new T(0);

唯一有效的方法是

代码语言:javascript
复制
retVal[i][j] = (T)new Object(0);

这不是我想要的。

这个是可能的吗?有没有一种更简单的方法来表示任何类型的数字(包括潜在的BigDecimal)的NxM矩阵,或者我卡住了?

EN

回答 9

Stack Overflow用户

发布于 2009-05-18 14:15:19

它应该是null而不是零。

如果你想为对象T放入等价的0,你需要提供一个T的工厂。类似这样:

代码语言:javascript
复制
interface Factory<T> {
   T getZero();     
}

你应该把这个方法写成这样:

代码语言:javascript
复制
private <T> T[][] zeroMatrix(int row, int col, Factory<T> factory) {
    T[][] retVal = (T[][])new Object[row][col];
    for(int i = row; i < row; i++) {
        for(int j = col; j < col; j++) {
            retVal[i][j] = factory.getZero();
        }
    }

    return retVal;
}

您还应该为工厂提供适当的实现:

代码语言:javascript
复制
 class IntegerFactory implements Factory<Integer> {
    Integer getZero() {
       return new Integer(0);
    }
}

通常,您也会将getMatrix(int row, int column)放在工厂实现中,以便实际返回正确的类型化数组。

票数 3
EN

Stack Overflow用户

发布于 2009-05-18 14:13:01

在Java中,该类型在运行时被擦除,因此您需要传入另一个参数来在运行时获取该类型。

它可以是初始化数组的值,也可以是要使用的类。

如果您选择传入类,那么使用一个类到值的映射来为每个类型存储一个零值。

然后,您可以使用java.util.Arrays.fill填充数组:

代码语言:javascript
复制
private static HashMap<Class<?>, Object> ZEROS = new HashMap<Class<?>,Object>();

static {
    ZEROS.put( Integer.class, Integer.valueOf(0) );
    ...
}

private static <T extends Number> T[][] zeroMatrix ( Class<T> type, int rows, int cols ) {
    @SuppressWarnings("unchecked")
    T[][]   matrix  = (T[][]) java.lang.reflect.Array.newInstance(type, rows, cols);
    Object  zero    = ZEROS.get(type);

    for ( T[] row : matrix ) 
        java.util.Arrays.fill(row,zero);

    return matrix;
}

Integer[][] matrix = zeroMatrix (Integer.class, 10, 10);

但是,如果性能是一个远程问题,您就不希望对数值代码使用盒装的值。

你真的不想尝试用null代替零-这会使你代码中所有其他路径的复杂度增加三倍。尽管您可以使用一个数字支持类来提供各种盒装数字类型的加法和乘法,但与提供两个或三个原始矩阵和几个大数字矩阵相比,您节省的复杂性将非常小,特别是如果您使用模板系统(例如ant的replace任务或XSLT)来生成源代码。

票数 2
EN

Stack Overflow用户

发布于 2009-05-18 14:11:01

Ye olde (引用)数组不能很好地处理泛型。在这种情况下,数组也可能是低效的。您正在创建数组的数组,因此存在不必要的间接和边界检查。最好是创建一个Matrix<T>类。您可能还希望向Matrix添加一个对表示零的T实例的引用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/877897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档