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

2023-11-26

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


我要么遇到了 Java 的限制,要么面临着我缺乏专业知识来试图弥补这一差距。

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

Options:

  • 使用反射...但请记住,类型擦除意味着您无法获得Class for Thing除非你明确地传递它
  • 如果你有got的一个实例Thing无论如何,只是将其作为摘要instance成员,在每个实现中恰好返回静态字段的值
  • 创建一个单独的类型层次结构,它将使用实例成员
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过通用父类访问子类中的 Java 静态成员 的相关文章

随机推荐

  • 如何打印一位?

    请告诉我如何打印一点 例如printf d bit 如果 bit 只是一个 int 其中包含最低有效位中所需的值 则 printf d bit 0x1 应该这样做 正在对仅设置了第一个有效位的数字进行二进制与 因此您将删除整数中的所有其余位
  • AngularJS ui-router: reload:true 也会重新加载父状态

    在这嘭嘭嘭你有两个 ui router 状态 一个父状态和一个子状态 当通过单击链接调用子项时 因为它有选项reload true它总是被重新加载 这很好 但问题是父状态也会重新加载 尝试多次单击 填充 11 链接 您将看到父时间戳也发生了
  • 如何使用 pandas 将多行合并为一行[重复]

    这个问题在这里已经有答案了 我需要将多行组合成一行 这将是简单的空格连接 View of my dataframe tempx value 0 picture1 1 5 1 picture555 1 5 2 picture255 1 5 3
  • 从多单元格区域获取格式化值

    Dim myText As String myText Range a3 Text 返回单元格 A3 中的格式化值 但是 myText Range a3 c7 Text 给我一个错误 如何从多单元格区域获取表示格式化值的字符串 同时保留数字
  • 空嵌套元组错误

    include
  • 更改 Google 地图信息窗口中的背景颜色

    我希望 Google 地图实现中的 InfoWindows 具有黑色背景颜色 InfoWindows 没有 backgroundColor 选项 See here 我在内容选项中放置了一个黑色背景和白色文本的 div 标签 然而 它仍然呈现
  • 错误:“用于调用 Google Play 开发者 API 的项目 ID 尚未在 Google Play 开发者控制台中链接。”

    我在使用服务帐户访问 Google Play Developer API 时收到以下错误 用于调用 Google Play 开发者 API 的项目 ID 尚未在 Google Play 开发者控制台中链接 服务帐户电子邮件和 p12文件是使
  • r - 来自子/父关系的分层数据框架

    我有一个子父 data frame 我想将其转换为包含所有级别和级别编号的完整层次结构列表 下面的示例数据分为三个级别 但也可能更多 我可以使用什么函数来转换数据 Source data frame name c land water ai
  • 如何删除 Matplotlib 图中的线条

    如何删除 matplotlib 轴的一行 或多行 使其实际上被垃圾收集并释放内存 下面的代码似乎删除了该行 但从未释放内存 即使显式调用gc collect from matplotlib import pyplot import nump
  • 了解 Vaadin 如何使用 GWT

    在使用 Vaadin 大约一周后 我很好奇 Vaadin 如何使用 GWT GWT 将 Javacode 编译为 Javascript 每次重新部署时都必须执行此操作 由于 Vaadin 必须被理解为一个以服务器为中心的框架 从而消除了编写
  • 如何在 Selenium Web Driver 中使用 SSL 证书?

    我在 Windows 7 上使用 Selenium Web 驱动程序 我正在尝试测试一个使用身份验证的网站 并且我需要使用 SSL 证书 当我在 Selenium 之外使用 Firefox 时 一切正常 但我注意到 Selenium 打开的
  • 无法使用 iOS 9.0 GM 在 Xcode 7.1 beta 上调试应用程序

    当我尝试在 iPad 上安装 iOS 9 0 GM 并使用 Xcode 7 1 Beta 7B60 运行我的应用程序时 出现以下错误 在此设备上启用开发时遇到错误 请尝试重新启动并重新连接设备 0xE8000076 这个问题有解决办法吗 苹
  • 版本控制如何工作?

    版本控制通常如何工作 它是否将 diff 文件保存为带有哈希值的跟踪以验证跟踪 查看Eric Sinks 关于版本控制的博客系列 此外 乔尔 斯波尔斯基写道Hg Init Mercurial 教程 这最终让我 了解 了分布式源代码控制的全部
  • 将表示为链表的两个大数相加,无需反转链表

    假设您有两个用链表表示的大数字 如何将它们相加并将结果存储在单独的链表中 例如 a 2 gt 1 gt 7 b 3 gt 4 result 2 gt 5 gt 1 您可以在不颠倒链表的情况下添加它们吗 伪代码 步骤1 遍历链表并将元素压入两
  • 在 numpy.correlate 中指定滞后

    Matlab互相关函数xcorr x y maxlags 有一个选项maxlag 返回滞后范围内的互相关序列 maxlags maxlags 纳比的numpy correlate N M mode 有三种模式 但没有一种模式允许我设置特定的
  • 如何使用 Python Pillow 定义模糊半径?

    我正在尝试模糊图像Pillow using 图像过滤器如下 from PIL import ImageFilter blurred image im filter ImageFilter BLUR 这工作得很好 只是它的设定半径对我来说太小
  • 获取未旋转的旋转矩形的边界

    我有一个已经应用了旋转的矩形 我想获得未旋转的尺寸 x y 宽度 高度 这是当前元素的尺寸 Bounds at a 90 rotation height 30 width 0 x 25 y 10 以下是旋转设置为无后的尺寸 Bounds a
  • Go mgo 包中的连接池

    文章中与 go 并发运行 mongodb 查询说 mgo DialWithInfo 创建一个会话 维护与 MongoDB 的套接字连接池 但是当我在文献记录函数的拨号信息我没有找到与我谈论池连接的内容 只有我在DialFunction Di
  • ES6 地图垫片如何工作

    根据我对文档的理解 here and here 需要一个对内存地址的引用才能工作 const foo const map new Map map set foo 123 Can only be done if memory address
  • 通过通用父类访问子类中的 Java 静态成员

    这似乎是一个新问题 但上次我使用 Java 时 该语言没有泛型 我有一个类层次结构 名称更改为尽可能通用 public abstract class AbstractBase public class ConcreateSubA exten