Java 泛型getter和setter方法

Java 泛型getter和setter方法,java,generics,setter,getter,getter-setter,Java,Generics,Setter,Getter,Getter Setter,我想写一个抽象类。这门课将成为一个领域。将有不同类型的字段需要扩展field类并编写自己的setter类。例如…将有一个字符串字段和一个整数字段 字符串字段需要扩展字段类,但必须有自己的setValue和getValue方法,该方法有一个要设置和返回的字符串变量。数字字段必须对整数执行相同的操作 我认为最好的方法是在超类中有一个泛型类型集值,但我不知道该怎么做。非常感谢您的帮助。您可以将您的超级类设置为通用: public abstract class Field<T>{ pri

我想写一个抽象类。这门课将成为一个领域。将有不同类型的字段需要扩展field类并编写自己的setter类。例如…将有一个字符串字段和一个整数字段

字符串字段需要扩展字段类,但必须有自己的
setValue
getValue
方法,该方法有一个要设置和返回的字符串变量。数字字段必须对整数执行相同的操作


我认为最好的方法是在超类中有一个泛型类型集值,但我不知道该怎么做。非常感谢您的帮助。

您可以将您的超级类设置为通用:

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

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

  public T getValue(){
     return value;
  }
}
公共抽象类字段{
私人T值;
公共无效设置值(T值){
这个值=值;
}
公共T getValue(){
返回值;
}
}
如果现在将其扩展为:

public class StringField extends Field<String>{
   //nothing to do here.
}
公共类StringField扩展字段{
//这里没什么可做的。
}
您已经完成了。

公共抽象类MyClass{
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>{}
私人T场; 公共T getField(){ 返回字段; } 公共无效设置字段(T字段){ this.field=字段; } } 公共类MyClassWithString扩展了MyClass{}
像这样:

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>{}
公共抽象类字段{
私人T值;
//+建造商
公共部门得不到{
返回值;
}
公共无效集(T值){
这个值=值;
}
}
公共类StringField扩展字段{}
公共类IntField扩展字段{}

您可能需要添加构造函数,例如
Field(T值)
StringField(strings)

这看起来是熟悉泛型的一个非常好的实践。现在有很多教程,所以我会试着解释一下发生了什么,然后我会敦促你也去看看其中的一些

基本上,您可以将泛型看作一种在运行时告诉对象它将具有哪些类型的方法,这是
中的类型

因此,
ArrayList
将是一个包含类型
字符串的ArrayList。因此,回到您不想做的事情,就是将
字段
类设置为泛型

这可以通过以下方式轻松实现:

public class Field<T> {
    private T field;
}
公共类字段{
私人T场;
}
现在,当您创建Field类的实例时,例如对于字符串,您只需编写:

Field<String> f = new Field<>();
字段f=新字段();
要编写与运行时确定的类型相同的泛型getter,必须执行以下操作:

public class Field<T> {
    private T field;

    public T getField() { return field; }
}
公共类字段{
私人T场;
public T getField(){return field;}
}
我将把创造二传手留给你做练习

请记住,在本例中,
T
是运行时
字段
获取的类型的占位符。

基本实现

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>{}
公共抽象类字段{
私人T值;
//+建造商
公共部门得不到{
返回值;
}
公共无效集(T值){
这个值=值;
}
}
公共类StringField扩展字段{}
公共类IntField扩展字段{}

有关更多详细信息,请访问此

我认为您的建议非常合理,它看起来像这样:

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>();
公共类字段{
私人T值;
公共字段(最终T值){
这个值=值;
}
公共T getValue(){
返回值;
}
公共无效设置值(最终T值){
这个值=值;
}
}
请注意,我已明确表示这不是有意抽象的。除非您真的想要为特定的字段类型实现额外的功能,否则没有必要将其用作一个超类。因此,您可以像下面这样定义Sting字段和数字字段:

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 stringField=新字段();
字段号字段=新字段();
当然,如果您确实希望在字段的类型化版本中有额外的实现,那么将其抽象并定义子类,如下所示:

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);
    }
}
公共类StringField扩展字段{
公共字符串字段(最终字符串值){
超级(价值);
}
}
公共类编号字段扩展字段{
公共数字字段(最终整数值){
超级(价值);
}
}

抽象类在哪里?
?公平的问题,我会把我的观点说得更清楚。在发布问题之前,先用谷歌搜索一下。谢谢大家的贡献。我研究过泛型,但不确定如何将其应用到我的场景中。