繁体   English   中英

如何实现抽象类的泛型字段?

[英]How to implement generic fields from abstract class?

我有一个具有一个字段的抽象类,该字段的类型在其子类之间可能有所不同。 例如:

public abstract class ABCModel {
    protected String foo;
    protected String bar;
    protected ? baz;
}

在我的实现中, baz可以是Int或Float。 例如:

public class ModelFoo {
     protected Int baz;
}

public class Modelbar {
     protected Float baz;
}  

首先,请问这在Java中是否是有效/可接受的设计模式? 我之所以选择这种模式,是因为我想从共享方法中抽象出大部分繁琐的样板。

根据我的实现方式,我会得到此错误的变种:

incompatible types: CAP#1 cannot be converted to BidAsk
where CAP#1 is a fresh type-variable:
CAP#1 extends Object from capture of ?

这使我相信我做错了什么。

与我的实际代码相比,我发布的示例有点琐碎,在该示例中,该泛型被埋在嵌套的哈希表中。 在尝试投入太多资金之前,我试图确定我正在做的是在Java中进行智能设计。

我尝试搜索此内容,但可能未正确表达该术语。

谢谢。

您要问的是泛型的基本用法:

public abstract class ABCModel<T> {
    private T baz;

    public T getBaz() { return baz; }

    public void setBaz(T baz) { this.baz = baz; }
}

public class IntModel extends ABCModel<Integer> { // baz is of type Integer   
}

public class FloatModel extends ABCModel<Float> { // baz is of type Float   
}

IntModel m1 = new IntModel();
Integer i = m1.getBaz();

FloatModel m2 = new FloatModel();
Float f = m2.getBaz();

在Java中不能覆盖字段。 但是,您可以将方法与泛型一起使用。

public abstract class ABCModel<T> {
    public abstract T getBaz();
}

然后

public class ModelFoo extends ABCModel<Integer> {
    public Integer getBaz() {
        ...
    }
}

这是一种可接受的模式,但是您应该更详细地了解泛型:

public abstract class ABCModel<T extends Number> {
    protected String foo;
    protected String bar;
    protected T baz;

    public T getBaz() {
      return baz;
    }
}

之后,您可以扩展模型:

public class ModelFoo extends ABCModel<Integer> {
     // No need to specify again baz.
}

暂无
暂无

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

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