奇怪的泛型错误

我试图使用泛型实现以下结构。得到一个奇怪的编译器错误,不能弄清楚为什么。
class Translator<T:Hashable> {...}

class FooTranslator<String>:Translator<String> {...}

这个想法是,译者使用T作为字典中键的类型。这可以是例如。 a String或枚举。子类提供具体的字典。

但它失败,因为:“类型’字符串’不符合协议’Hashable’”

但String符合Hashable!我坚果吗?它也不适用于Int,也符合Hashable。它也不工作,如果我替换Hashable与Equatable,这也应该由两个实现。

如果我删除类型约束,只是为了测试(我还必须禁用字典,因为我不能使用任何不哈希的密钥) – 它编译

class Translator<T> {...}

class FooTranslator<String>:Translator<String> {...}

我究竟做错了什么?

我不是一个Swift开发人员,但是在Java中遇到过类似的问题,我怀疑问题是,你现在声明一个类型参数叫String,因为你声明了类FooTranslator< String> – 因此,转换器< String>中的类型参数只是那个类型参数,它没有约束。你根本不想要一个类型参数,我怀疑(即你不希望你的FooTranslator是一个泛型类本身。)

如在评论中所指出的,在Swift subclasses of a generic class also have to be generic.你可以声明一个throw-away类型参数,如下所示:

class FooTranslator<T>:Translator<String>

这仍然避免声明一个新的类型参数称为String,这是什么导致的问题。这意味着你引入一个新的类型参数,当你不想要任何类型参数,但它可能比没有什么更好!

这是所有的假设,你真的需要一个子类,例如。添加或覆盖成员。另一方面,如果你只想要一个类型与Translator< String>完全相同,你应该使用一个类型别名:

typealias FooTranslator = Translator<String>

或者甚至混合两个在一个可怕的方式,如果你真的想要一个子类,但不想以一个通用的方式引用它:

class GenericFooTranslator<T>:Translator<String>
typealias FooTranslator = GenericFooTranslator<Int>

(请注意,Int这里是故意不是String,以表明T在转换器中不同于FooTranslator中的T。)

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...