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

Java 如何从抽象类实现泛型字段?,java,generics,Java,Generics,我有一个抽象类,它有一个字段,该字段的类型可以在其子类之间变化。例如: public abstract class ABCModel { protected String foo; protected String bar; protected ? baz; } public class ModelFoo { protected Int baz; } public class Modelbar { protected Float baz; }

我有一个抽象类,它有一个字段,该字段的类型可以在其子类之间变化。例如:

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

public class Modelbar {
     protected Float baz;
}  
在我的实现中,
baz
可以是Int或Float。例如:

public abstract class ABCModel {
    protected String foo;
    protected String bar;
    protected ? baz;
}
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的智能设计

我已经试着寻找这个,但可能没有正确地表达术语


谢谢。

在Java中无法重写字段。但是,您可以将方法与泛型一起使用

public abstract class ABCModel<T> {
    public abstract T getBaz();
}
公共抽象类ABCModel{
公共摘要T getBaz();
}
然后

公共类ModelFoo扩展了ABCModel{
公共整数getBaz(){
...
}
}

这是一种公认的模式,但您应该更具体地说明您的泛型:

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

    public T getBaz() {
      return baz;
    }
}
公共抽象类ABCModel{
受保护字符串foo;
受保护的线棒;
保护T-baz;
公共T getBaz(){
返回baz;
}
}
之后,您可以扩展模型:

public class ModelFoo extends ABCModel<Integer> {
     // No need to specify again baz.
}
公共类ModelFoo扩展了ABCModel{
//无需再次指定baz。
}

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

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();
公共抽象类ABCModel{
私人T-baz;
公共T getBaz(){return baz;}
公共空间setBaz(T baz){this.baz=baz;}
}
公共类IntModel扩展了ABCModel{//baz的类型为Integer
}
公共类FloatModel扩展了ABCModel{//baz是Float类型
}
IntModel m1=新的IntModel();
整数i=m1.getBaz();
FloatModel m2=新的FloatModel();
Float f=m2.getBaz();

一目了然,这应该是
类ABCModel
类ModelFoo扩展ABCModel
类ModelBar扩展ABCModel
。那么您是说在指定T的任何地方都会覆盖“”?例如,所有引用都将变成整数或浮点数。它比那稍微复杂一些,但是是的,这就是想法。所以我的受保护变量根本没有被继承?更正,不能被重写。它们不能被重写,但它们肯定可以被继承并成为泛型。谢谢Steve。既然您已经用方法代替了我的字段,那么我的扩展类每次都必须重新定义字段baz吗?没关系,只是想让我明白?换句话说,getBaz()不需要访问私有变量int baz吗?例如,谢谢。例如,谢谢。调用getters@flkes在生产环境中获得一些NullPointerException之后,您将不会如此确定;)如果我不是一个抽象类,而是用泛型方法编程到一个接口,那么想法也是一样的?@AdamSkywalker-welp,。。现在我必须重新思考如何处理原语P