我正在尝试编写一个抽象类。这个课将成为一个领域。将有不同类型的字段需要扩展字段类并编写自己的setter类。例如....将有一个字符串字段和一个整数字段。
String Field需要扩展Field类,但必须拥有自己的setValue
和getValue
方法,该方法具有要设置和返回的String变量。 Number Field必须对Integer执行相同的操作。
我认为最好的方法是在超类中使用Generic Type设置Value,但我不知道该如何处理。任何帮助非常感谢。
答案 0 :(得分:1)
你可以让你的超级类通用:
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 :(得分: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>{}
您可能希望添加Field(T value)
和StringField(String s)
等构造函数。
答案 2 :(得分:1)
这对于熟悉泛型来说似乎是一种非常好的做法。现在有很多教程可供使用,所以我会尝试解释一下发生了什么,然后我会敦促你们查看其中的一些。
基本上,您可以将泛型视为在运行时告诉您的对象它将具有哪种类型的方式,这是<
和>
中的类型。
因此ArrayList<String>
将是包含类型String
的ArrayList。所以回到你要做的事情就是让你的Field
类通用。
这可以通过以下方式轻松完成:
public class Field<T> {
private T field;
}
现在,当您创建Field类的实例时,比如说String,您只需编写:
Field<String> f = new Field<>();
要编写与运行时期间决定的类型相同类型的通用getter,您将执行以下操作:
public class Field<T> {
private T field;
public T getField() { return field; }
}
我将为你制作一个制定者作为练习。
请记住,在这种情况下,T
是Field
在运行时获取的类型的占位符。
答案 3 :(得分: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>{}
答案 4 :(得分: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;
}
}
请注意,我故意将此作为摘要。除非您确实希望为特定字段类型实现额外功能,否则无需将其用作超类。因此,您可以像这样定义Sting Fields和Number Fields:
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);
}
}
答案 5 :(得分: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>{}