方法返回类型以满足多个接口

2023-12-31

是否可以指定一个返回实现两个或多个接口的对象的方法?

假设我们有以下接口:

interface FooBar {
    [Foo] & [Bar] getFooBar();
}

interface Foo {
    void doFoo();
}

inteface Bar {
    void doBar();
}

的实施者FooBar需要提供方法getFooBar()返回一个类型的实例,该类型满足FooBar.

到目前为止我尝试的是使用泛型来做到这一点:

interface FooBar {
    <T extends Foo & Bar> T getFooBar()
}

class SomeImplementor implements FooBar {
    private FooAndBarImpl fSomeField;

    public <T extends Foo & Bar> T getFooBar() {
        return fSomeField;
    }

}

鉴于FooAndBarImpl是框架或库提供的某种类型并实现Foo and Bar我认为这应该有效。然而,事实并非如此,因为“FooAndBarImpl 无法转换为 T”。这是为什么?所暗示的合同getFooBar()正如我所见,并没有破损。

另一个解决方案是定义一个新的接口来扩展Foo and Bar并将其用作返回类型。我只是觉得返回一个空包装纸没有多大意义fSomeField in the getFooBar()执行。

EDIT:

如果有人能解释为什么泛型方法不起作用,我将不胜感激。我就是没看到。


您可以将 T 设为类参数:

class SomeImplementor<T extends Foo & Bar> implements FooBar {
    private T fSomeField;

    public T getFooBar() {
        return fSomeField;
    }

}

至于为什么你的泛型方法不起作用。让我们创建以下两个类来实现Foo and Bar:

class A implements Bar, Foo{
   private int a;
   ...
}
class B implements Bar, Foo{
   private String b;
   ...
}
class SomeImplementor implements FooBar {
   private A someField;
   public <T extends Foo & Bar> T getFooBar() {
      return someField;
   }
}

所以我们现在应该能够执行以下命令:

SomeImplementor s = new SomeImplementor();
A a = s.getFooBar();
B b = s.getFooBar();

虽然getFooBar()返回类型 A 的对象,该对象没有有效转换为类型 B(其中String成员来自哪里?),即使 B 满足以下要求<T extends Foo & Bar>,即是一个有效的T.

简而言之,编译器(记住,泛型是编译时机制)不能保证每个T类型的<T extends Foo & Bar>可以对其进行赋值类型A。这正是您看到的错误 - 编译器无法将给定的 A 转换为每个有效的 T。

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

方法返回类型以满足多个接口 的相关文章

  • @Nullable 和 SonarQube “有条件执行的块应该可达”警告

    包有以下package info java ParametersAreNonnullByDefault package foo import javax annotation ParametersAreNonnullByDefault 类有
  • Zuul不转发请求到其他微服务

    我正在使用 Spring Boot 微服务 我已经配置了 eureka zuul 代理和另一个微服务 帐户 如果我直接从帐户拨打电话 则工作正常 帐户和 zuul 服务器都显示在 eureka 上 当我尝试使用 zuul 代理进行访问时 它
  • JaxB2Marshaller 未将 XML 绑定到 Kotlin 数据类

    我正在编写一个批处理作业来解析 XML 提取字段并将它们保存在数据库中 解析 XML 时 它会选取 2 个根元素 但将所有字段保留为空 因此在我的数据库中 我有 2 条记录将为空字段 似乎无法弄清楚为什么它无法读取元素 TIA Bean f
  • Java 中具有级别顺序插入的完整二叉搜索树

    我们接到一个任务 需要编码 二叉搜索树 那个树has to be complete not perfect 这意味着所有不在最低级别或次低级别的节点都应该有 2 个子节点 而最低级别的节点应尽可能远离左侧 我们需要插入到树中等级顺序 所以如
  • 如何通过双击图标来执行JAVA程序?

    我写了一个java程序 现在我想在没有 IDE Eclipse 等的情况下打开我的控制台 java 应用程序 只需双击桌面上的可执行版本即可 我已将 java 项目导出为 Runnable JAR 文件 但无法打开 当我尝试使用cmd打开应
  • 转换为 JSON 后保留 XMLGregorianCalendar 日期格式 - Jackson Lib

    我有一个对象 它有 2 个 XMLGregorianCalendar 对象 一个用于日期 另一个用于时间 我使用 Jackson 对象映射器将日期转换为 JSON 格式 转换前的日期为2014年2月10日 时间为11 15 00 转换为 J
  • 在 Retrofit 中的 POST 请求中发送空正文

    我的 api 需要一个空的 json 主体 发出帖子请求时 如何在 Retrofit 和 Jackson 中进行设置 我尝试通过null 和空字符串 以及 但无法让它发挥作用 POST my url Call
  • Java setLocation() 事故

    我正处于创建一个程序来操作员工 客户系统的开始阶段 现在我刚刚创建了登录 GUI 但我遇到了一些问题 setLocation 方法 我将其设置为 250 250 但这使我的 GUI 高度变得非常疯狂 如果有人能够解决这个问题 我的代码如下
  • 如何将多个值存储到一个键(java)

    我搜索一个可以存储多个键值对的数据结构 数据基本上是这样的 1 value 1 2 value 2 于是我想到了使用HashMap 遗憾的是 这对我不起作用 因为一个键可能会出现多个值 在上面的例子中 1 value 2 可能是另一个条目
  • 在同一个容器但不同的耳朵中使用本地EJB

    我正在尝试在同一个 Glassfish 但不同的耳朵中使用本地 EJB 但是Glassfish找不到本地EJB或者无法消费 我读到了这个 根据 JavaEE 教程 Local bean 的客户端 必须在与其访问的企业 bean 相同的 JV
  • 在单个 C# 泛型方法中返回可为 null 和 null?

    C 泛型方法是否可以返回对象类型或 Nullable 类型 例如 如果我有一个安全的索引访问器List我想返回一个值 稍后我可以使用以下任一方法检查该值 null or HasValue 目前我有以下两种方法 static T SafeGe
  • 无法安装 JDK 9,因为“另一个 Java 安装正在进行中”

    我已经在 Windows 10 x64 上使用 JDK 9 一段时间了 但是当我去安装最新的早期版本 b174 时 我首先卸载了以前的版本 像往常一样 然后运行新的安装程序 它失败并显示一个消息框 显示 另一个 Java 安装正在进行中 您
  • Jlist 自定义渲染器

    我正在尝试添加一个我猜你会称其为列表中每个项目的子列表 我构建了一个自定义渲染器 它提供以下输出 正如你所看到的 有些东西不对劲 我没能找到问题的答案 我猜我需要更改面板布局中的某些内容才能获得正确的结果 但不知道是什么 https i s
  • 调用本机方法时返回 java.lang.UnsatisfiedLinkError

    我正在尝试为第三方 DLL 制作 Java 包装器 我创建了自己的 DLL 充当 JNI 和第三方 DLL 之间的中间人 在java中我加载这个DLL很好但是错误java lang UnsatisfiedLinkError sixense
  • 在 Tomcat 中触发内部 ServletRequest

    我正在使用 Quartz 来安排 Web 应用程序的后台任务 其中一些任务只是针对同一 Web 应用程序发出请求 我想避免依赖于任何类型的网络设置 例如 如果从数据中心内发出带有我自己域名的请求 则可能无法正确路由 是否有一个 Java A
  • 错误:找不到符号 ArrayList

    我正在尝试创建某种列表来存储数组 表 中的值 我在这里使用数组列表 但我应该使用列表吗 但是 每次我尝试编译时 它都会引发以下错误 找不到标志 符号 ArrayList类 位置 玩家类 TablePlayer 代码如下 public cla
  • 从 Apache Kafka 中的主题删除消息

    所以我是 Apache Kafka 的新手 我正在尝试创建一个简单的应用程序 以便我可以更好地理解 API 我知道这个问题在这里被问了很多 但是如何清除存储在主题上的消息 记录 我看到的大多数答案都说要更改消息保留时间或删除并重新创建主题
  • 解析XML文件以获取所有命名空间信息

    我希望能够从给定的 XML 文件中获取所有名称空间信息 例如 如果输入 XML 文件类似于
  • 在 Android 版 ORMLite 中加入类会引发 SQL 异常:找不到外部类,反之亦然

    我正在尝试使用 QueryBuilder 为两个不同的类创建一个联接查询 一个Product类和一个Coupon类 引用 Product 属性 storeId public class Coupon DatabaseField column
  • java银行程序帐户ID不上去?

    每次创建银行帐户时 帐户 ID 都应增加 1 但每次我尝试提取 Id 时 我只会得到帐户 ID 为 0 任何建议 因为我完全按照我学习的书中的方式进行操作而且它仍然没有更新 帐户构造函数 public class BankAccount p

随机推荐

  • RVO(返回值优化)适用于所有对象吗?

    Is RVO 返回值优化 http en wikipedia org wiki Return value optimization 保证或适用于 C 编译器 特别是 GCC 中的所有对象和情况 如果答案是 否 那么类 对象的这种优化的条件是
  • 将命令行参数传递给随 Poetry 安装的 Python 脚本

    诗歌文档 https python poetry org docs pyproject scripts表示脚本部分可用于在安装包时安装脚本或可执行文件 但它没有显示任何如何将参数传递给脚本的示例 您如何才能接收argparse函数中的参数
  • IntelliJ JDK 16 抢先体验 - 有成功吗?工具.jar

    有没有人使用 JDK 16 取得过成功 https jdk java net 16 https jdk java net 16 使用 IntelliJ 进行早期访问构建 我能够使用 JDK 15 早期访问版本 但是当我尝试 JDK 16 时
  • 删除一项内的内容时在行上方创建神秘空间

    我有一个包含一些项目的网格 当我单击任何项 目时 我会将该项目的内容移动到模式中 该模式效果很好 但是当我从项目中删除内容时 项目上方会出现一个空格 我知道解决这个问题的方法可能是使用弹性盒 它工作得很好 但我想了解这里发生了什么 这里可能
  • CSS3 高度 100%

    我不知道如何问 写这个 所以请随时更新名称或指出正确的问题 标题 我正在设计一个跨 html5 css3 网站 并试图使其在每个 常见 浏览器上看起来都相同 这就是我所拥有的 http www pojotlan com example1 h
  • ProgressBars 和 Espresso

    当我在运行一些浓缩咖啡测试时显示的布局中有一个进度条时 然后我遇到 Caused by android support test espresso AppNotIdleException Looped for 1670 iterations
  • 在调试之前尝试启动带有任务的服务器时出现“无法跟踪指定的任务”

    我的调试配置如下launch json type node request attach preLaunchTask npm start name Attach port 9090 这是定义在中的任务tasks json type npm
  • C++ 和 D 中的元编程

    C 中的模板机制只是意外地对模板元编程有用 另一方面 D 是专门为促进这一点而设计的 显然它更容易理解 或者我听说过 我没有使用 D 的经验 但我很好奇 当涉及到模板元编程时 在 D 中可以做什么而在 C 中不能做什么 在 D 中帮助模板元
  • Android:自定义视图的默认属性

    我有一个扩展框架类之一的自定义视图 最多ViewAndroid 中的 s 为它们定义了一些默认属性 例如Button可点击 由以下设置android clickable true 如何为我的自定义视图提供应用程序范围的默认值 我这样解决了我
  • 如何在文件更改时更新 UI

    你好 我正在使用几个 Excel 文件构建一个闪亮的仪表板 我在框的页脚中插入了这些文件的链接 我想refresh更改我的 Excel 文件中的某些内容时的闪亮仪表板 我不想每次都运行整个 R 代码 文件内容更改后如何重新渲染输出 这里有一
  • ColladaLoader 和 ProgressCallback

    实施的正确方法是什么加载栏 in ColladaLoader 源代码显示加载器采用三个参数 其中一个是progressCallback progressCallback total length loaded request respons
  • pyglet on_draw 事件仅在鼠标移动时发生

    我有一个奇怪的问题 当 pyglet 应用程序启动时 它只绘制 1 2 帧然后冻结 on draw 事件停止发生 但每次我移动鼠标或按键时 on draw 事件也会调度 简而言之 我必须移动鼠标才能使我的 pyglet 应用程序基本工作 这
  • NHibernate.MappingException:没有持久化:XYZ

    现在 在你说之前 我did谷歌和我的hbm xml file is嵌入式资源 这是我调用的代码 ISession session GetCurrentSession var returnObject session Get
  • 使用 C 从文本文件中打印出数组

    我正在尝试创建一个代码 它从纺织品中读取数据 然后将数据存储到内存中 打印到屏幕上以便用户可以读取它 但它仍然保存到内存中 以便您可以将其用于其余部分节目的 这是纺织品的样品 75 nevermind nvm not much nm no
  • 在Java中获取文件/目录所有者的名称[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 OSX 上的 Java 中获取文件所有者的名称 https stackoverflow com questions 3096805 how do i get the name of a fil
  • 类型错误:canvas.getContext 不是函数

    我正在尝试使用 canvas 元素在 Javascript 中为跟随光标的球设置动画 我将对画布对象的引用传递给名为 followMouse 的函数 但是当我尝试获取其上下文时 firebug 给出了以下错误 类型错误 canvas get
  • C++ TR1 正则表达式 - 多行选项

    我认为 表示字符串的结尾 然而 下面的代码给出了 testbbbccc 作为结果 这对我来说非常令人惊讶 这意味着 实际上匹配行尾 而不是整个字符串的结尾 include
  • JUnit:4.8.1“找不到类”

    好吧 我和其他人一样 是 jUnit 的新手 并且很难让它正常工作 我搜索过论坛但提供了答案 我只是不明白 如果有人可以帮助我 我将不胜感激 让我提供基础知识 操作系统 Mac OS X 6 export JUNIT HOME Develo
  • Listviewdefs 中的 SugarCRM Smarty 代码

    我正在尝试使用 Smarty PHP 在 SugarCRM 6 5 3 的 ListView custom modules Leads metadata listviewdefs php 中实现自定义功能 这工作正常 customCode
  • 方法返回类型以满足多个接口

    是否可以指定一个返回实现两个或多个接口的对象的方法 假设我们有以下接口 interface FooBar Foo Bar getFooBar interface Foo void doFoo inteface Bar void doBar