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()是参数类型(实际上是引用参数,但是没有一个是事情,所以没有推论).最终我需要获取一个特殊的令牌,这就是我变得模糊的地方.
令牌是每个具体类的巨大屁股唯一的字符串.它们是基于类的,而不是基于实例的.实际的令牌值被声明为每个子类中的私有静态final字段.
所以我需要使用基类的公共方法/字段(最终)到一个子类的私有静态字段.显然,我不能在基础中声明一个抽象的静态方法,因为这是没有道理的.如果数据是基于实例的,那么这将是微不足道的,在基类中有一个多态的getter,但是子类的东西是静态的.
我觉得我在这里缺少Java泛型的一个特性,但是除了在抽象基类中声明的东西之外,我不能使用Thing.whatever().我正在与Java的限制或我缺乏专门技术来弥补差距.我所做的一个似乎有希望的尝试也一直在类层次结构中有一大堆代码重复,定义了与完全相同的代码一遍又一遍的抽象方法,这是泛型应该有助于防止!
解决方法
I’m running up against either limitations of Java or my lack of expertise trying to bridge the gap.
这是Java的一个限制,虽然是一个相当合理的一个IMO.基本上,您仍然试图使用静态成员,就像它们是多态的,这不会奏效 – 泛型不会帮助你.
选项:
>使用反射…但是请记住,类型擦除意味着你不能得到类的事情,除非你明确地传递它>如果你有一个Thing的实例,只需使它成为一个抽象实例成员,每个实现中都会返回静态字段的值>创建一个单独的类型层次结构,它将使用实例成员