0

我正在学习 Java(这里是长期 C++ 人),并且在将 Integer 类转换为原始类型 int 时遇到了一些问题。我已经看到了几种解决方案,但似乎都没有。

使我的案例与众不同的是转换发生在泛型类中(整数是泛型参数)。该类扩展了 JProgressBar 并继承了自定义(模板化)接口 TaskObject。

ProgressBar 类的代码:

private class ProgressBar<Integer> extends JProgressBar 
    implements TaskObject<Integer> {

    @Override
    public void update(Integer val) {
        System.out.println("pbar updating to " + val);
        setValue(val);
    }

}

TaskObject 接口代码:

interface TaskObject<T> {
    void update(T value);
}

ProgressBar instacne 作为 TaskObject 的一种类型传递给 SwingWorker 线程并从该线程更新(因此是 update() 函数)。

不幸的是,setValue 不会采用 Integer 类型,并且使用 (int) 转换失败,以及 Integer 类转换方法。最后的具体错误说明“整数扩展了在类 ...ProgressBar 中声明的对象”。

很明显,我使用 Integer 作为通用参数这一事实使编译器在调用 JProgressBar.setValue() 时感到困惑......我对如何解决这个问题有一半的想法,但似乎很多为微利而工作,所以我想我会把它扔在那里,看看是否有其他人有意见......

4

2 回答 2

1
private class ProgressBar<Integer> extends JProgressBar 
implements TaskObject<Integer>

这里使用的实际上是定义了一个名为“Integer”的新类型参数,它与类Integer无关。java.lang.Integer

您目前拥有的相当于:

private class ProgressBar<MyTypeVariable> extends JProgressBar 
implements TaskObject<MyTypeVariable> {

    @Override
    public void update(MyTypeVariable val) {
        System.out.println("pbar updating to " + val);
        setValue(val);
    }

}

由于您要做的只是为其类型参数实现TaskObject接口,因此将其定义为:java.lang.IntegerT

private class ProgressBar extends JProgressBar 
implements TaskObject<Integer> {

    @Override
    public void update(Integer val) {
        System.out.println("pbar updating to " + val);
        setValue(val);
    }

}

现在您可以调用 JProgressBar 的setValue(int)方法,val因为由于自动装箱,编译器将自动转换值。

于 2013-10-01T05:08:22.203 回答
0

您的代码在语法上是正确的,但您有一个严重的缺陷:为什么选择“Integer”作为您的类型参数?

private class ProgressBar<Integer>     // <-- here
    extends JProgressBar 
    implements TaskObject<Integer> {

当您认为自己正在使用Integer. 摆脱的通用性ProgressBar(它不是必需的,因为JProgressBar实际上只接受数值)。换句话说,在 Java 中,您将模板参数放入您所派生的类,而不是新类。这是有道理的,因为ProgressBar一种特殊的 a TaskObjectfor Integers。

tl; dr:ProgressBar不应该是通用的,TaskObject应该是。

于 2013-10-01T04:47:43.670 回答