在java泛型类中将Integer转换为int

时间:2013-10-01 04:27:25

标签: java generics type-conversion

我正在削减Java(这里的长时间C ++人),而且我遇到了将Integer类转换为原始类型int的问题。我已经看到了几个解决方案,但似乎都没有。

使我的案例独特的是转换发生在泛型类中(Integer是泛型参数)。该类扩展了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线程并从该线程更新(因此更新()函数)。

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

很明显,我使用Integer作为泛型参数这一事实让编译器在调用JProgressBar.setValue()时感到困惑......我对如何解决这个问题有一些想法,但它似乎很多工作都没有什么好处,所以我想我会把它扔出去看看是否有其他人有意见......

2 个答案:

答案 0 :(得分:1)

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

此处使用的Integer实际上是定义一个名为&#39;整数&#39;的新类型参数。这与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.Integer实现T接口,请将其定义为:

private class ProgressBar extends JProgressBar 
implements TaskObject<Integer> {

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

}

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

答案 1 :(得分:0)

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

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

当您认为使用Integer时,您在班级方法中使用“整数”。摆脱ProgressBar的通用性(不需要它,因为JProgressBar实际上只接受数值)。换句话说,在Java中,您将模板参数放在您从派生的类中,而不是新类。这是有道理的,因为ProgressBar TaskObject Integer的特殊类型

tl; dr:ProgressBar不应该是通用的,TaskObject应该是。{/ p>