通用的getter和setter方法

4
我正在尝试编写一个抽象类,这个类将成为一个“字段”(Field)。有不同类型的字段需要扩展这个字段类并编写自己的setter类,例如:String字段和Integer字段。
String字段需要扩展Field类,但必须有自己的setValue和getValue方法,并使用String变量进行设置和返回。Number字段也必须使用Integer执行相同的操作。
我认为最好的方法是在超类中设置一个通用类型的Value,但我不确定如何做到这一点。非常感谢任何帮助。

在发布问题之前,先做一点谷歌搜索。 - Ratul Ghosh
6个回答

2

You can make your super class generic:

public abstract class Field<T>{
  private T value;

  public void setValue(T value){
     this.value = value;
  }

  public T getValue(){
     return value;
  }
}

如果您现在进行扩展,如下所示:

public class StringField extends Field<String>{
   //nothing to do here.
}

你已经完成了。

1

Like this:

public abstract class Field<T> {
    private T value;
    // + constructor(s)
    public T get() {
        return value;
    }
    public void set(T value) {
        this.value = value;
    }
}

public class StringField extends Field<String>{}
public class IntField extends Field<Integer>{}

您可能想要添加构造函数,例如Field(T value)StringField(String s)

1
这看起来像一个非常好的实践,让您熟悉泛型。现在有很多教程可以使用,我将尝试解释一下正在发生的事情,然后我会敦促您查找其中的一些内容。
基本上,您可以将泛型视为一种在运行时告诉对象其类型的方法,这是在<>中的类型。
因此,ArrayList<String> 将是包含类型String的 ArrayList。 因此,回到你想做的,就是使你的Field类成为通用类。
这可以通过以下方式轻松实现:
public class Field<T> {
    private T field;
}

现在当您创建您的Field类的实例,比如一个字符串,您只需要写下以下代码:
Field<String> f = new Field<>();

要编写一个与运行时决定的类型相同的通用 getter,您需要执行以下操作:
public class Field<T> {
    private T field;

    public T getField() { return field; }
}

我会留下创建setter的练习给你完成。
请记住,在这种情况下,T 是在运行时Field获取的类型的占位符。

感谢所有做出贡献的人。我已经学习了泛型,但不确定如何将其适用于我的情况。 - user3859651

1
基本实现
public abstract class Field<T> {
    private T value;
    // + constructor(s)
    public T get() {
        return value;
    }
    public void set(T value) {
        this.value = value;
    }
}

public class StringField extends Field<String>{}
public class IntField extends Field<Integer>{}

如需更多细节,请访问此链接 链接2


1
我认为您提出的建议非常合理,它将类似于这样:

public class Field<T extends Object> {

    private T value;

    public Field(final T value) { 
        this.value = value;
    }

    public T getValue() {
        return value;
    }

    public void setValue(final T value) {
        this.value = value;
    }
}

请注意,我特意没有将其抽象化。除非您确实想要为特定字段类型实现额外的功能,否则无需将其用作超类。因此,您可以像这样定义您的字符串字段和数字字段:

Field<String> stringField = new Field<String>();
Field<Integer> numberField = new Field<Integer>();

当然,如果您想在Field的类型化版本中添加额外实现,则可以将其定义为抽象类,并按以下方式定义子类:
public class StringField extends Field<String> {
    public StringField(final String value) {
        super(value);
    }
}

public class NumberField extends Field<Integer> {
    public NumberField(final Integer value) {
        super(value);
    }
}

抽象类在哪里? - ChiefTwoPencils
公道的问题,我会让我的观点更加清晰。 - Dan Temple

0
public abstract class MyClass<T>{
  private T field;

  public T getField(){
    return field;
  }

  public void setField(T field){
    this.field = field;
  }
}


public class MyClassWithString extends MyClass<String>{}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接