获取左手类的静态方法调用?

时间:2012-01-06 03:02:31

标签: java generics

有时从静态调用中获取类型名称很有用,请参阅以下示例:

class Base {
    private static void funImpl(Class<? extends Base> type) {
        ...
    }
    public static void fun() {
        fun(Base.class);
    }
}

class User extends Base {
    public static void fun() {
        fun(User.class);
    }
}

这里为每个子类声明fun()。那么,我可以写这样的东西吗?

class Base {
     private static void funImpl(Class<? extends Base> type) {
         ...
     }
     public static void fun() {
         Class<?> leftHandClass = System.getLeftHandClass(); // Error: d'oh...
         funImpl(leftHandClass);
     }
}

class User extends Base {
}

1 个答案:

答案 0 :(得分:1)

同意。不是必须“告诉”超类使用它的子类,而是以相反的方式执行它,并在超类中声明抽象方法以实现子类。这样,不是让一个大型类具有一堆case语句来处理它的每个子类,而是特定于每个子类的代码都在子类中。

如果您的问题是您希望子类实例是单例(即使用静态方法),请考虑使用枚举。因此,不是在类上调用静态方法,而是在枚举常量上调用实例方法:SQUARE.fun()等。

enum Foo {
    SQUARE {
        public String getColor() {
            return "RED";
        }
    },
    CIRCLE {
        public String getColor() {
            return "GREEN";
        }
    },
    TRIANGLE {
        public String getColor() {
            return "BLUE";
        }
    };
    public abstract String getColor();

    public void fun() {
        System.out.println("I am a " + name() + " and my color is " + getColor());
    }
}