2

我在一个类中有两个重载的构造函数方法(来自 UJMP 包):

DefaultSparseIntMatrix(long... size)

DefaultSparseIntMatrix(int maximumNumberOfEntries, long... size)

我想用 int 调用第二个,但是编译器给出了这个错误:

reference to DefaultSparseIntMatrix is ambiguous

这就是我现在所说的:

Matrix m = new DefaultSparseIntMatrix((int) (vertices.length*50), (long) vertices.length, (long) vertices.length);

如何强制第一个参数为 int,而不是 long?我知道反过来,只是转换为 a (long),但我需要它是一个 int 。

4

3 回答 3

2

尝试

Matrix m = new DefaultSparseIntMatrix((int) (vertices.length*50), new long[]{vertices.length,vertices.length});

vararg 是数组的语法糖,它还允许直接传入数组

于 2011-11-06T22:19:57.207 回答
2

使用 long 列表或 int 后跟 long 列表调用函数只是自找麻烦,尤其是因为 java 会自动为您将 int 转换为 long。(换句话说,您传递给该构造函数的内容对任何一个都适用)。

如果你对这个参数模式死心塌地(我强烈建议你改变它),你将不得不接受 Integer 类型(而不是 int 类型),并显式地将 Integer 对象传递给函数。

换句话说,试试这个:

DefaultSparseIntMatrix(Long... size)

DefaultSparseIntMatrix(Integer maximumNumberOfEntries, Long... size)
于 2011-11-06T22:20:20.757 回答
1

我会使用构建器模式并使用类似的东西,它与构造函数一样易于使用,并且其目的更清晰:

Matrix m = new DefaultSparseIntMatrixBuilder().withMaxNumberOfEntries(vertices.length * 50)
                                              .withSize(vertices.length, vertices.length)
                                              .build();

build 方法调用 DefaultSparseIntMatrix 的私有构造函数,并将构建器本身作为唯一参数,并且构造器从构建器获取数据。

于 2011-11-06T22:24:58.973 回答