【问题标题】:Converting Integer to int in a java generic class在 Java 泛型类中将 Integer 转换为 int
【发布时间】:2013-10-07 03:04:25
【问题描述】:

我正在学习 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 类转换方法。最后的具体错误说明“Integer extends object declaration in class ...ProgressBar”。

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

【问题讨论】:

  • 你试过val.intValue()吗?
  • 这是一个通用类。 Java 中没有模板,并且 template != generic。

标签: java generics type-conversion


【解决方案1】:

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

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

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

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

【讨论】:

  • 模板参数在继承方案中的应用对我来说特别有用,因为 C++ 要求模板参数也应用于子类。谢谢你。
  • 对不起,我的回答很简短,我有点赶时间......我很高兴其他人回答得更彻底。
【解决方案2】:
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.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);
    }

}

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

【讨论】:

  • 会把它交给 thriqon,如果你的回答只提供了他的解决方案的一个例子。但是,您的解决方案立即清楚地表明我只是将合法类型标识符重新用作通用参数名称。
猜你喜欢
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
相关资源
最近更新 更多