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