实现一个接受两个不同类的参数的通用函数?

时间:2018-05-20 11:12:16

标签: java generics

我有两个类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)

  }
} 

谢谢

1 个答案:

答案 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 { ... }