繁体   English   中英

扩展抽象泛型类的麻烦

[英]Trouble with extending abstract generic class

我需要创建一个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)

我无法弄清楚为什么这不起作用。 如何扩展抽象通用超类并实现它?

基于这个问题: 扩展通用抽象类和正确使用超级

我试过了:

class VTextField_Integer<Integer> extends VTextField_Core<Integer> {
class VTextField_Integer<Integer> extends VTextField_Core<E> {

我很难过。

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
    }
}

并且您不需要抽象类的setAmount方法中的类型参数<E>

abstract class VTextField_Core<E> extends JTextField {
    public abstract E getAmount();
    public abstract void setAmount(E amount);
}

将您的方法声明为:

public abstract void setAmount(E amount);

即不要声明新的类型变量。

此方法签名:

public abstract <E> void setAmount(E amount);

说该方法必须接受任何 Object 您不能在子类中将其更改为仅接受某些对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM