这似乎是一个新问题,但上次我使用 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 的限制,要么面临着我缺乏专业知识来试图弥补这一差距。我所做的一次看起来很有希望的尝试也有大量的代码重复,一直到类层次结构,一遍又一遍地使用完全相同的代码定义抽象方法......这就是泛型应该帮助防止的!