我需要创建一个只强制某种输入的JTextField
(我的某些功能的目标是排除使用JFormattedTextField
)。为了实现这一点,我想创建一个带有泛型的abstract JTextField
类:
abstract class VTextField_Core<E> extends JTextField {
public abstract E getAmount();
public abstract <E> void setAmount(E amount);
}
以这样的方式实现它:
class VTextField_Integer<Integer> extends VTextField_Core {
@Override
public void setAmount(Integer amount) {
// format Integer to text
}
@Override
public Integer getAmount() {
// parse text and return Integer
}
}
class VTextField_Double<Double> extends VTextField_Core {
@Override
public void setAmount(Double amount) {
// format Double to text
}
@Override
public Double getAmount() {
// parse text and return Double
}
}
但这会产生编译错误:
name clash: setAmount(Integer) in Test2.VTextField_Integer and <E>setAmount(E) in Test2.VTextField_Core have the same erasure, yet neither overrides the other
where Integer,E are type-variables:
Integer extends Object declared in class Test2.VTextField_Integer
E extends Object declared in method <E>setAmount(E)
我无法弄清楚为什么这不起作用。如何扩展抽象通用超类并实现它?
基于这个问题:Extending Generic Abstract Class & Correct Use of Super
我试过了:
class VTextField_Integer<Integer> extends VTextField_Core<Integer> {
class VTextField_Integer<Integer> extends VTextField_Core<E> {
我很难过。
答案 0 :(得分:9)
class VTextField_Integer<Integer>
声明了一个名为Integer
的类型参数,这不是您需要的。
将课程更改为:
class VTextField_Integer extends VTextField_Core<Integer> {
@Override
public void setAmount(Integer amount) {
// format Integer to text
}
@Override
public Integer getAmount() {
// parse text and return Integer
}
}
class VTextField_Double extends VTextField_Core<Double> {
@Override
public void setAmount(Double amount) {
// format Double to text
}
@Override
public Double getAmount() {
// parse text and return Double
}
}
您不需要抽象类的<E>
方法中的类型参数setAmount
。
abstract class VTextField_Core<E> extends JTextField {
public abstract E getAmount();
public abstract void setAmount(E amount);
}
答案 1 :(得分:1)
将您的方法声明为:
public abstract void setAmount(E amount);
即。不要声明一个新的类型变量。
此方法签名:
public abstract <E> void setAmount(E amount);
说该方法必须接受任何 Object
。您无法在子类中将其更改为仅接受某些对象。