这似乎是一个新问题,但我上次使用 Java 时,该语言没有泛型。我有一个类层次结构(名称更改为尽可能通用):
public abstract class AbstractBase { .... }
public class ConcreateSubA extends AbstractBase { .... }
public class ConcreateSubB extends AbstractBase { .... }
...
public class ConcreateSubZZ9PluralZAlpha extends AbstractBase { .... }
...
我正在尝试清理一些遗留代码,并且有一个地方可以通过泛型将大量重复重复全部分解为单个例程。(我在考虑泛型,因为当调用这个例程时,它只需要对一个具体类进行操作。)
例程看起来像
public <Thing extends AbstractBase> void someFunc()
{
another_function_call (Thing.concreteSpecialToken);
// could also be
// another_function_call (Thing.concreteSpecialToken());
// if methods are more feasible than fields
// Cannot use
// another_function_call (Thing().concreteSpecialToken());
// because creating instances of these types is a Major Operation[tm]
}
我省略了无数行,但这是重要的部分: someFunc()
是类型参数(它实际上需要参数,但它们都不是事物,所以没有推理)。最终我需要获取一个特殊的令牌,这就是我变得模糊的地方。
标记是每个具体类的巨大的唯一字符串。它们是基于类的,而不是基于实例的。实际的标记值private static final
在每个子类中声明为一个字段。
所以我需要使用基类的公共方法/字段来(最终)获取子类的私有静态字段。显然我不能abstract static
在基中声明一个方法,因为那没有意义。如果数据是基于实例的,那么这将是微不足道的,在基类中有一个多态的 getter,但子类的东西是静态的。
我觉得我在这里缺少 Java 泛型的一个特性,但我不能使用Thing.whatever()
,除非它whatever
是可以在抽象基类中声明的东西。我遇到了 Java 的限制或我缺乏试图弥合差距的专业知识。我所做的一个看起来很有希望的尝试也有大量的代码重复,一直到类层次结构,一遍又一遍地用完全相同的代码定义抽象方法......这就是泛型应该帮助防止的!