X 类型的参数必须支持接口 Y

2024-01-09

我有这样的设置:

IBuilder = interface(IInvokable)
end;

IBuilder<T: IBuilder; TOut : TWinControl> = interface(IInvokable)
end;

TBuilder<T: IBuilder; TOut : TWinControl> = class(TInterfacedObject, IBuilder, IBuilder<T, TOut>)
end;

TBuilder = class(TBuilder<TBuilder, TWinControl>)
end;

这种结构允许我构建如下糖语法:

TBuilder<T : IBuilder; TOut : TWinControl> = class(TInterfacedObject, IBuilder, IBuilder<T, TOut>)

  function Output : TOut;
  function Name(aName : string) : T;
  function Left(aLeft : Integer) : T;
  function Top(aTop : Integer) : T;

end;

// ... later

TBuilder.Create().Left(10).Top(5).Name('ABC'); // Nice one liner

问题是我收到编译错误,说

E2514 The type parameter TBuilder must support interface 'IBuilder'.

这可能是由于类型约束造成的T: IBuilder存在于界面上,即使 TBuilder 确实支持 IBuilder(通过它的祖先)。

谁能指导我如何解决这个问题?

虽然,我不能使用TBuilder = class(TBuilder<IBuilder, TObject>)


这是不可能的。你本质上是想这样做:

  IBar = interface(IInterface) end; 

  TFoo<T : IBar> = class(TObject, IBar) end;

  TBar = TFoo<TBar>;

哪个会产生错误

E2086 类型“TBar”尚未完全定义

如果没有接口依赖性,您可以将其写为

 TBar = class(TFoo<TBar>) end;

使其成为真正的后代,而不仅仅是一个别名。这通常可以解析类型,但接口依赖性迫使编译器提出以下问题:Does TBar支持IBar?

如果您考虑一下,结果如下:

TBar = TFoo<TBar>   {TBar support IBar?}  
             |
             TBar = TFoo<TBar>... {ok, TBar support IBar?}
                          |
                         TBar = TFoo<TBar> {ok, TBar support IBar?}
                                      |
                                      {...turtles all the way down}

您要求编译器解决无限递归问题。它不能这样做。

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

X 类型的参数必须支持接口 Y 的相关文章

  • 在 XMLDocument 中使用 DocumentElement 时发生访问冲突

    当我尝试使用时 我总是遇到访问冲突DocumentElement of the XMLDocument 我创造XMLDocument基于某些文件的存在 错误信息 项目project1 exe引发异常类EAccessViolation 消息
  • 当 C# 位于同一包含类中时,为什么以及如何允许访问类本身之外的私有变量?

    我不知道这个问题是否具有足够的描述性 但是这种行为为什么以及如何存在 public class Layer public string Name get set private IEnumerable children public IEn
  • 向Java类库添加函数

    我使用的 Java 类库在很多方面都不完整 有很多类我认为应该内置其他成员函数 但是 我不确定添加这些成员函数的最佳实践 让我们调用不足的基类A class A public A long arbitrary arguments publi
  • Delphi XE5 FireDAC 错误:无法加载供应商库 [libmysql.dll 或 libmysqld.dll]

    我在 Windows 7 64 位上使用 Delphi XE5 只是尝试 FireDAC 组件 我正在使用一个 TFDConnection 组件连接到本地 MySQL 数据库 v5 6 15 我已经将 libmysql dll 32位 v5
  • 不兼容的类型:Class 无法转换为 Class,其中 CAP#1 是新类型变量

    当我编写一些代码时 我遇到了一些让我烦恼的事情 我在下面的代码示例中收集了两个示例 The cls1行使用 lambda 表达式但不编译 而cls2行使用方法引用并编译 我知道 如果我使用非泛型对象 那么那里没有问题 但在这里 我使用泛型
  • 指针^ 与 s[1]

    在读取数据的函数中 数据含义只字符串 从磁盘 我应该更喜欢哪个 哪个更好 A DiskStream Read Pointer s Count or B DiskStream Read s 1 Count Note 我知道两者都有相同的结果
  • 了解 C# 中的协变和逆变接口

    我在一本有关 C 的教科书中遇到过这些内容 但我很难理解它们 可能是由于缺乏上下文 对于它们是什么以及它们有什么用处 是否有一个很好的简洁解释 编辑以澄清 协变接口 interface IBibble
  • C#/.NET 3.5:转换扩展通用列表的对象

    我通过带有返回接口类型的方法的外观公开 API 并且在 C NET 3 5 中遇到了通用列表和继承的问题 我有两个接口 IMyList 实现 IList IMyItem 和三个类 MyList 实现 IMyList 扩展 List MyOt
  • 在 tlistbox 中绘制缩略图

    在 DelphiXE 中 我使用 tFileOpenDialog 选择一个文件夹 然后在 tListBox 中列出该文件夹中的所有 jpg 文件 我允许将列表项拖放到列表中进行自定义排序 以便稍后按顺序显示它们 我希望能够在文件名旁边绘制图
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • 使用 IdTCPClient 和 IdTCPServer 发送和接收 TMemoryStream

    我在 XE2 中找到了 Remy Lebeau 的 IdTCP 组件聊天演示 我想玩一下 可以发现 我想使用这些组件发送图片 最好的方法似乎是使用 TMemoryStream 如果我发送字符串 连接工作正常 字符串传输成功 但是当我将其更改
  • delphi专家中的第三方依赖

    我正在编写一个delphi ide Expert 带有一些第三方依赖项 视觉控件 我的问题是当这个专家将安装在目标机器上时 这台电脑是否也需要安装这些第三方组件 或者组件是embeded在生成的 bpl 内部 它们将依赖于您放置在包的 re
  • 如何从 Java 8 中的 getAnnotatedParameterTypes() 获取泛型类型信息?

    这好像是getAnnotatedParameterTypes 返回一个数组AnnotatedTypes 持有原始类型 而不是通用类型 例如 public
  • iPhone - ShareKit 、 SHKm 给出“找不到文件”的编译器错误

    我在使用 ShareKit Integrated 编译我的 iphone 项目时遇到了这个问题 我正在研究这个问题 到目前为止一切都工作正常 突然现在它给了我错误 在 SHK m 文件中 import include objc objc c
  • SSL 错误 1409442E 使用 TIdHTTP 通过 HTTPS 下载文件 [重复]

    这个问题在这里已经有答案了 我正在使用德尔福10 3 3 下面的代码曾经有效 但现在尝试通过 HTTPS 下载文件时遇到错误 连接 SSL 错误错误 1409442E SSL 例程 SSL3 READ BYTES tlsv1 警报协议版本
  • C# 如何在运行时动态生成实现不同接口的对象?

    我正在研究如何解决问题 但我什至不确定这在 C 和 NET 3 5 中是否可行 假设我的接口数量有限 每个接口都描述一组特定的 不相关的方法 现在我有许多现实世界的设备 每个设备都可以仅实现这些接口的一个子集 在与这些设备建立通信期间 他们
  • Vaadin:在表中显示列表

    我需要显示表中列表中包含的所有值 例如 class Person String name String age List
  • 调用泛型类的方法

    这是上下文 我尝试编写一个映射器来动态地将域模型对象转换为 ViewModel 对象 我遇到的问题是 当我尝试通过反射调用泛型类的方法时 出现此错误 System InvalidOperationException 无法对 Contains
  • Java 泛型/类型调度问题

    考虑以下程序 import java util List import java util ArrayList public class TypeTest public static class TypeTestA extends Type
  • 如何指定从 Delphi TStream 读取的组件的所有者?

    我正在从流中读取组件 并且希望能够指定 Owner 属性 var TComponent comp stream Seek 0 soFromBeginning comp stream ReadComponent nil 谁拥有 comp 我该

随机推荐

  • Angular 2:{{object}} 有效,{{object.child}} 抛出错误

    使用 Angular v1 已有一段时间了 自从 Angular v2 推出 Beta 版以来 我一直在研究它 现在我已经有了这段代码 但无法让它工作 真的不知道为什么 不知何故 当我打印时 profileUser json 一切正常 pr
  • 将 C++ 库与 Objective-C 应用程序链接和使用

    我正在编写一个图形应用程序 使用 Objective C 作为前端 使用 C 进行图形处理和网络通信 我在苹果网站上四处阅读 寻找一种方法来链接 dylib or so将我的 C 代码添加到我的 Xcode 项目中 但似乎没有任何效果 我能
  • 有时 GET 返回 304 而不是 200

    我正在使用 Node js 和 mongodb 我似乎有时会收到 200 有时会收到未修改的 304 router get add to bag id req res next gt req session bag push req par
  • Java JTable 更新行

    我正在创建一个像这样的 JTable String colName new String ID Country Name Page titel Page URL Time Object products new Object 123 USA
  • 为什么 PhoneGap 总是显示默认的启动画面图像?

    我现在正在测试一个示例 iOS 应用程序 尽管我在 Xcode 项目目标屏幕的 摘要 选项卡 中设置了所有新的启动图像 但 PhoneGap 3 0 仍然显示其默认启动屏幕 为什么 即使闪屏是一个插件并且现在默认情况下不包含在 PhoneG
  • 使用 WebFlux 从资源中读取和解析文件的反应方式?

    我想知道从资源中读取 解析和提供文件的正确方法是什么 目前 我做了这样的事情 fun getFile request ServerRequest Mono
  • Android HttpsUrlConnection eofException

    我有一个问题 当我尝试读取任何输入时 我的 HttpsURLConnection 将抛出 EOFException 该代码适用于某些网络调用 但不适用于其他网络调用 如果我尝试从连接中读取任何内容 则会失败并出现上述错误 Example u
  • RXJS中异步流是如何传输的?

    我试图了解流是如何通过 RXjs 中的管道传输的 我知道这不应该成为一个问题 因为这就是异步流的整个想法 但仍然有一些我想理解的事情 看这段代码 var source Rx Observable range 1 3 flatMapLates
  • 如何在 Visual Studio 中启用 CUDA 项目的单独编译

    我是 CUDA 新手 我正在尝试编写一个应用程序 在其中从另一个内核函数调用一个内核函数 但我收到错误 内核启动自device or global函数需要单独的编译模式 在构建应用程序时 这是我的完整代码 任何帮助 将不胜感激 includ
  • 手风琴与 for 循环一次仅打开一项

    我正在尝试向我的手风琴添加一个交互式 id 但是我的代码中出现了一些问题 手风琴会打开每个手风琴项目 我想要的只是在单击它时能够一次打开一个手风琴项目 for study in studies div class accordion div
  • 什么是 Swift.AnyClass?

    我正在调查UITableView类 我发现 open func register cellClass Swift AnyClass forCellReuseIdentifier identifier String Reading here
  • 解析和检查 Haskell 代码的库?

    hackage中是否有任何库可以解析haskell代码并检查它是否是有效代码 我愿意尝试一下进化模型 我想检查生成的代码字符串是否可以编译 而无需将它们写入磁盘并运行编译器 理想情况下 如果也能够在字符串中运行代码就好了 但只检查代码的有效
  • 一起使用 ORDER BY 和 GROUP BY

    我的表如下所示 我使用的是 MySQL m id v id timestamp 6 1 1333635317 34 1 1333635323 34 1 1333635336 6 1 1333635343 6 1 1333635349 我的目
  • 如何在flutter中开启设备GPS?

    通过使用 Dart 的 simple permissions 和 location 包 它只需要请求用户许可允许或拒绝应用程序使用设备位置来在 Google 地图上显示用户的当前位置 当我在设备上手动打开 GPS 时 我能够获取当前位置 但
  • 如何修复 phpMyAdmin 中的 WordPress MySQL 表?

    背景故事 我在 Mac 上使用 MAMP 设置本地开发服务器和数据库来创建 WordPress 网站 一切都很顺利 昨天 MySQL服务器没有启动 所以我采纳了StackOverflow上答案的建议 从mysql56文件夹中删除了ib lo
  • 在 PyQt4 中动态更改 QLabel 文本

    我的问题是 如何更改标签中的文本 标签位于布局内 但是setText 似乎不起作用 也许我做得不对 这是我的代码 这是主窗口 GUI Qt Designer 给出的 class Ui dashboard QtGui QMainWindow
  • Telerik RadGrid - 如何默认为编辑模式?

    我想让 RadGrid 的项目在页面加载时可编辑 我在这里尝试了两种方法http www telerik com help aspnet grid grddefaulteditmodeforgriditemsoninitialload ht
  • Bootstrap4下拉菜单填充输入组

    我想解决一个非常简单的引导问题 根据指南 https getbootstrap com docs 4 0 components dropdowns https getbootstrap com docs 4 0 components dro
  • Animationend 事件也会在子元素的动画结束时触发?

    我有一个带有动画的 div 我已将animationend 事件侦听器附加到该div 该 div 还有一个带有动画的子元素 由于某种原因 当子元素的动画完成时 animationend 事件也会触发 为什么是这样 有办法解决这个问题吗 我希
  • X 类型的参数必须支持接口 Y

    我有这样的设置 IBuilder interface IInvokable end IBuilder