我正在削减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()时感到困惑......我对如何解决这个问题有一些想法,但它似乎很多工作都没有什么好处,所以我想我会把它扔出去看看是否有其他人有意见......
答案 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>