通用类型参数哪个具体扩展类?

2024-01-11

我想要一个实现接口的类,该接口指定特定的子类作为参数。

public abstract Task implements TaskStatus<Task> {
  TaskStatus<T> listener;

  protected complete() {
      // ugly, unsafe cast
      callback.complete((T) this);
  }
}

public interface TaskStatus<T> {
   public void complete(T task);
}

但我想保证使用的 type-arg 不仅仅是任务或 ,而是扩展该类的特定类的类型参数。

所以我想出的最好的办法是:

public abstract Task<T extends Task> implements TaskStatus<T> {
}

你可以通过写来扩展它:

public class MyTask extends Task<MyTask> {
}

但这也是有效的:

public class MyTask extends Task<SomeOtherTask> {
}

并且回调的调用将会因ClassCastException而爆炸。那么,这种方法是错误的并且被破坏了,还是有一种正确的方法可以做到这一点,我不知何故错过了?


目前尚不清楚你想在里面做什么Task。但是,如果您定义泛型类Task<T>如下:

class Task<T extends Task<T>> { ... }

以下两种是可能的:

class MyTask extends Task<MyTask> { ... }
class YourTask extends Task<MyTask> { ... }

但禁止以下行为:

class MyTask extends Task<String> { ... }

上面的定义Task使用 F-bounded 多态性,这是一个相当高级的功能。您可以查看研究论文“面向对象编程的 F 有界多态性 http://www.cs.utexas.edu/~wcook/papers/FBound89/CookFBound89.pdf“ 了解更多信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通用类型参数哪个具体扩展类? 的相关文章

随机推荐

  • Selenium 在 -browserSessionReuse 模式下启动新浏览器

    我正在尝试 browserSessionReuse Selenium 模式来加速我的测试 但我注意到了一个奇怪的行为 这种模式的目的是避免在测试之间浪费时间打开浏览器 这就是它的工作原理 但并非总是如此 如果我连续运行测试 它们就会在同一个
  • 禁用 VS 代码中的警告

    在此输入图像描述 https i stack imgur com KVDnO png 当我点击禁用 工作区 错误是 无法禁用扩展 ESLint 扩展 Node js 扩展包 依赖于此 还有什么其他方法可以消除反应本机错误 你需要定义 esl
  • ggplot 在函数中不起作用,以字符串形式传入变量名

    我有以下简单的功能 但它的 ggplot 命令不起作用 当从命令行给出该命令时 该命令可以正常工作 gt testfn lt function gdf first second library ggplot2 print ggplot gd
  • 包含 symfony2 的文件

    我正在使用 google Drive api 在 symfony2 中进行捆绑 我在 Utils 文件夹中有一个类 Authentication 它与 google 中的文件 我放入完全相同的文件夹中 进行交互 我想将这些文件包含在我的 A
  • 在 B 列中为 A 列中的相同值选择最小值 excel?

    我想得到例如第 1 列中相同值的第 2 列中的最小值或最大值 在我的示例中 我希望值 A 列 1 的列 2 的最大值为 18 而 B 的最大值为 27 我尝试过使用数组函数 但无法使其正常工作 敬请期待任何提示或解决方案 Example C
  • 如何从 web 应用程序运行量角器?

    我想运行一些量角器测试 针对 angularApp 为此 我创建了一个用户界面 提示用户输入脚本文件 然后我需要以某种方式让量角器启动并运行测试 我有哪些选择来实现这一目标 您可以将文件传递到后端 并保存它 然后后端像平常一样执行测试pro
  • 有没有办法在 IE 中获取边框半径和渐变背景?

    我想知道是否有任何使用 javascript 或其他方法让 IE 显示边框半径或渐变背景的解决方法 我在寻找在 IE9 中使用 渐变和边框半径 的修复时遇到了这个问题 是的 虽然您现在可以在 IE9 中同时使用两者 但遗憾的是您不能同时使用
  • 使用 Vector 的 SIMD 向量化 C# 代码运行速度比经典循环慢

    我看过几篇文章描述了如何Vector
  • 递归重命名对象键

    我有一个递归函数来重命名对象的键名称 但我无法弄清楚如何重命名其中 2 个键 问题键是对象 我认为问题在于我正在检查对象类型 但此时如何重命名密钥 实际的数组非常大 但下面是一个缩小版本 任何帮助表示赞赏 var keys short ch
  • 表单中的两种方式数据绑定不起作用 Angular 2

    我有这个表单组件 它将作为输入User目的 我想使用该对象进行双向数据绑定 但它不起作用 有什么想法问题出在哪里吗 PS 问题似乎来自于输入参数的复制 如果我传递原始文件 它可以正常工作 但如果我传递副本 则两种方式的数据绑定将不起作用 我
  • 如何将日志消息从多处理模块路由到文件?

    In the Python 文档我发现记录消息 http docs python org library multiprocessing html logging在使用多处理模块生成不同进程的 python 脚本中是可能的 import m
  • 了解 Cassandra 中单个分区的读取

    我有一个 3 节点设置 Node1 172 30 56 60 Node2 172 30 56 61 和 Node3 172 30 56 62 它具有100K的单个分区数据 分区由nodeip构成 请查找 NodeIP 的令牌 分区值 172
  • 有序列表 (ol) 显示的数量?

    我的页面上有一个有序列表 ol 但编号根本没有显示 我已经这样做了 ol li my text li li my text li li my text li ol 当我输入上面的内容时 stackoverflow 能够按照我想要的方式正确渲
  • 替换序言中的空格

    在序言中是否可以用某个给定字符替换字符串的所有空格 例子 如果我有一个变量How are you today 而且我要How are you today 对于原子 有多种方法可以做到这一点 我发现以下特别简单 使用atomic list c
  • 在 Yii 2 中加载 jQuery 等核心脚本

    我一直很难弄清楚如何加载jQuery或其他核心脚本Yii 2 In Yii 1看来就是这样 在 Yii 2 中 app 是 Yii 的一个属性 而不是一个方法 所以上面的方法自然不行 而是改成 产生此错误 Getting unknown p
  • 测试 libstdc++ 的版本是否使用符合 C++11 的 std::string

    我正在编写一些 C 11 代码 这些代码对以下性质做出了假设std string有效 但代表 C 11 中更改的行为 早期 libstdc 的basic string实现符合 98 03 要求 但不符合更严格的 C 11 要求 据我了解 l
  • 让 GDB 在调试时完整打印一个大的 std::map

    我正在研究一种使用大地图的算法 我试图在纸上做的同时遵循 GDB 的算法 看看哪里出了问题 但随着地图变大 GDB 会缩写它并停止显示我需要的下一个值 gdb p R 1 std map with 140 elements 0 1 e 2
  • Anaconda/Orange3 产生 OSError: [WinError 193] %1 不是有效的 Win32 应用程序

    当我尝试在 Anaconda 中的 Windows 10 下启动 Orange 3 时 我得到了 以下错误 Traceback most recent call last File C Users i7 Anaconda3 Scripts
  • 带字符串的 switch 语句中需要常量表达式错误[重复]

    这个问题在这里已经有答案了 我收到一个 JSON 响应 大致如下所示 status success data The status字段可以有两个值 success or fail 所以在我的代码中 我有以下枚举 private enum S
  • 通用类型参数哪个具体扩展类?

    我想要一个实现接口的类 该接口指定特定的子类作为参数 public abstract Task implements TaskStatus