gpt4 book ai didi

通过通用父类访问的子类中的 Java 静态成员

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:14:23 27 4
gpt4 key购买 nike

这似乎是一个新问题,但上次我使用 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() 是类型参数(它实际上接受参数,但它们都不是事物,所以没有推论)。最终我需要获取一个特殊的 token ,这是我变得模糊的地方。

标记是每个具体类的巨大的唯一字符串。它们是基于类的,而不是基于实例的。实际 token 值在每个子类中声明为 private static final 字段。

所以我需要使用基类的公共(public)方法/字段来(最终)获得子类的私有(private)静态字段。显然我不能在基类中声明一个 abstract static 方法,因为那没有意义。如果数据是基于实例的,那么这将是微不足道的,在基类中有一个多态的 getter,但子类的东西是静态的。

我觉得我在这里缺少 Java 泛型的一个特性,但我不能使用 Thing.whatever() 除非 whatever 是可能的在抽象基类中声明。我遇到了 Java 的局限性或我缺乏试图弥合差距的专业知识。我所做的一次看起来很有希望的尝试也有大量的代码重复,一直沿着类层次结构向下,一遍又一遍地用完全相同的代码定义抽象方法……这正是泛型应该帮助防止的!

最佳答案

I'm running up against either limitations of Java or my lack of expertise trying to bridge the gap.

这是 Java 的一个限制,尽管在我看来是一个相当合理的限制。基本上,您仍在尝试使用静态成员,就好像它们是多态的一样,这是行不通的 - 泛型在这方面帮不了您。

选项:

  • 使用反射...但请记住,类型删除意味着您无法获取 ThingClass,除非您显式传递它
  • 如果您得到 Thing 的实例,只需将其设为抽象实例 成员,它在每个实现中恰好返回静态字段的值
  • 创建一个单独的类型层次结构,它将使用实例成员

关于通过通用父类访问的子类中的 Java 静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13588620/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com