我有两个类A和B,它们都有一个共同的field
,我想创建一个函数,如果我传递Class A对象,那么我想将该公共字段值设置为传递值,如果我传递B类对象,那么我想将该公共字段值设置为传递的值。谁能告诉我怎么能这样做,我是Java Generic Classes
的新手。
否则我将不得不创建两个不同的函数OR
我必须创建一个if和else,它将决定传递的对象属于哪个类??
A类
public class A{
int footer;
public void setFooter(int fo) {
footer = fo;
}
}
B类
public class B{
int footer;
public void setFooter(int fo) {
footer = fo;
}
}
D类
public class D{
public void change_footer(T generic_param, int value) {
generic_param.setFooter(value);
}
}
班级HelloWorld
public class HelloWorld{
public static void main(String []args){
Here I want to call
A a = new A();
new D().change_footer(a, 5);
B b = new B();
new D().change_footer(b, 5)
}
}
谢谢
答案 0 :(得分:1)
如果我把所有问题都弄错了,A和B都不是通用的,那么字段的类型是固定的。 那么你的意思是:
class D {
/*public <T extends Super> would be muuuch nicer here as well!*/
public /*static*/ <T> void change_footer(T obj, int data) {
//otherwise, you could just cast to Super...and set dat field.
if (obj instanceof A) {
((A) obj).setField(data);
} else if (obj instanceof B) {
((B) obj).setField(data);
} // else ... ?
}
}
原始答案:
简单易用(“直接”实施产生了预期的结果。):
class A<T> {
T daField;
public void setField(T pField) {
daField = pField;
}
public T getField() {
return daField;
}
}
class B<T> extends A {//empty
}
class Test {
public static void main(String... args) {
B<Object> testB1 = new B<>(); //
testB1.setField(new Object());
System.out.println(testB1.getField());
B<String> testB2 = new B<>();
testB2.setField("blah blah");
System.out.println(testB2.getField());
B<Integer> testB3 = new B<>();
testB3.setField(42);
System.out.println(testB3.getField());
}
}
的System.out:
java.lang.Object@6d06d69c
blah blah
42
当你想要实例化T
s ...但仍然可能/其他问题时,它会变得更复杂。 :)
修改您的评论:
如果只有一个共同字段,那么为什么不:
/*abstract */class Super<T> {
T daField;
public void setField(T pField) {
daField = pField;
}
public T getField() {
return daField;
}
}
? ...和
class A<T> extends Super { ... }
class B<T> extends Super { ... }