【发布时间】:2023-03-23 00:35:01
【问题描述】:
我有一个抽象类MyClass,它带有一个静态方法,可以用许多MyClassDescendant 对象填充给定集合。此方法应调用MyClassDescendant 的静态getRandom() 方法来获取对象实例。
我当前的代码如下所示:
public static void populate(Collection<MyClass> coll, Class<? extends MyClass> cl, int num) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
for (int i = 0; i < num; i++) {
Method m;
m = cl.getMethod("getRandom");
coll.add((MyClass)(m.invoke(null)));
}
}
那我这样称呼它:
MyClass.populate((Collection<MyClass>)(Collection<?>)collection, MyClassDescendant.class, 3);
此代码有效,但很难看。我真正想要达到的效果是这样的:
MyClassDescendant.populate(collection, 3);
如果不是静态方法,我会使用this.getClass()。我知道MyClass.class 适用于静态方法,但我不希望class 适用于MyClass,而是适用于特定的MyClassDescendant(后代类型很少)。
有没有办法在没有实例或类名的情况下获取类对象?
【问题讨论】:
-
由于基类中的方法
populate()是静态的,所以在派生类中不能被覆盖。相反,您可以在每个派生类中实现它,以使用该类的实例填充集合。 -
是的,可以,但我想避免在多个类中复制粘贴几乎相同的代码。
-
你总是在静态上下文中调用它吗?
-
你不能覆盖静态方法,你只能隐藏它们......如果你真的想覆盖它们,你需要让它成为非静态的
-
您要么必须复制代码,要么必须将类提供给方法,因为集合没有任何关于其项目类型的信息,因为泛型是通过类型擦除实现的Java。