日期:2014-05-20  浏览次数:20672 次

如何定义实现静态方法的重写,有什么变通的法子没?
本帖最后由 fortitan 于 2013-02-23 09:57:10 编辑
静态方法不能重写,可是写程序时又碰到这种需求,有什么变通的法子没?
我想写这样一个父类S,让他的子类A,B等都有一个名为getFieldNames()的静态方法,不同的子类调用这个方法时返回值是不同的.
然后我写一个泛型类G,类中要用到getFieldNames()这个方法.如下:

class S {
    //这里面怎么写getFieldNames()
}
class A extends S {
    //这里要重写getFieldNames(),怎么实现
}
class G<T extends S> {
    void fun(){
        //调用getFieldNames()做一些事件.
        T.getFieldNames();
    }
}

求一个变通的法子,或者别的思路什么的都行?

------解决方案--------------------
明显这是要做一个策略模式
先做个接口规范操作。
A 和 B都实现了这个接口,

这样你要用时再决定传入A还是B.

静态方法无解。
------解决方案--------------------
引用:
引用:我真晕
 S s = new A();或者S s =  new B();
 s.getFieldNames(); quote]
在G类里面,我怎么知道是A 还是B~


Quote: 引用:
明显这是要做一个策略模式
先做个接口规范操作。
A 和 B都实现了这个接口,

这样你要用时再……

使用反射可以实现你的要求

import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;

class S {
public static String[] getFieldNames(){
return new String[]{"a","b"};
}
}
class A extends S {
public static String[] getFieldNames(){
return new String[]{"c","d"};
}
}
class G<T extends S> {
    void fun(Class<T> t){
        //调用getFieldNames()做一些事件.
        try {
         System.out.println(Arrays.toString((Object[]) t.getDeclaredMethod("getFieldNames").invoke(null)));
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
    }
}
public class TestStatic {

/**
 * @param args
 */
public static void main(String[] args) {
G<S> g=new G<S>();
g.fun(S.class);

G<A> g2=new G<A>();
g2.fun(A.class);


}

}