当前位置: 首页 > 面试题库 >

为什么泛型不编译?

常茂
2023-03-14
问题内容

我正在尝试使用泛型实现以下结构。收到编译器错误,无法找出原因。

class Translator<T:Hashable> {...}

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

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

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

但是String符合Hashable。它也不适用于Int,后者也符合Hashable。

如果删除类型约束,则仅用于测试(在此我还必须禁用字典,因为我不能在其中使用任何不可哈希的键)-它会编译

class Translator<T> {...}

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

我究竟做错了什么?


问题答案:

我不是开发商斯威夫特,但是看在Java中类似的问题,我怀疑的问题是,此刻的你正在声明称为类型参数String,因为你宣告classFooTranslator<String>-这样的类型 参数_的Translator<String>就是这种类型的参数,没有任何限制。你不
_希望
在所有类型参数,我怀疑(即你不希望你FooTranslator成为一个通用类本身)。

如注释中所述,在通用类的子类中,也必须是通用类。您可以声明一个抛弃型参数,如下所示:

class FooTranslator<T>:Translator<String>

仍然避免声明一个名为的新类型参数String,而这正是导致此问题的原因。这意味着你要介绍的,当你不新类型参数
任何类型的参数,但它可能是聊胜于无…

所有这些都基于您确实需要一个子类的假设,例如添加或覆盖成员。另一方面,如果您只想要与 完全相同
的类型Translator<String>,则应改用类型别名:

typealias FooTranslator = Translator<String>

甚至甚至以可怕的方式将两者混合使用,如果您确实想要一个子类但又不想以一种通用的方式引用它:

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

(注意,Int这里是故意不String,以表明TTranslator不一样TFooTranslator)。



 类似资料:
  • 问题内容: 我正在使用泛型编写某些东西,令我惊讶的是,我发现这行不通: 那我不能实例化泛型吗?没有任何方法可以做到这一点吗? 问题答案: 是的,这真是令人讨厌。 我使用的解决方法是强制客户端在构造新类时传递类-即 然后您可以使用。

  • 为什么需要泛型 前言 泛型程序最早出现1970年代的CLU和Ada语言中, 后来被许多机遇对象和面向对象的语言锁采用 1993年C++在3.0版本中引入的模板技术就属于泛型编程 1994年7月ANSI/ISO C++标准委员会通过的STL更是泛型编程的集大成者, 它已被纳入1998年9月C++标准之中. 2004年9月Java在J2SE 5.0(JDK 1.5)中开始使用泛型技术; 2005年11

  • 问题内容: 我希望从编译时以及运行时的角度来看,提供正确类型的返回值都不会成为问题。 但是我一定是错的。 编辑: 它不与和。 问题答案: 根据该方法的Javadoc: 实际结果类型为| X | 是擦除其上调用的表达式的静态类型。例如,此代码段中不需要强制转换 在此,您的代码段中的值为,因此只能分配给或。 使用这种特定措辞的原因是因为当您说该变量具有类型T其中where时,可以存在多个扩展的类,因此

  • 问题内容: 我有一个通用的抽象模板类。我以为如果创建特定于类型的生产者,则可以直接在通用类中注入一些DAO服务。但是我不能。 为什么?我该如何解决? 当我注入一个例如它完美地工作。但是没有泛型… 问题答案: 当您要求 容器知道您要一个类型为的bean 。如果存在这样的bean并且其类型信息已知,则容器可以满足注入。例如,类型信息保留在带注释的方法中 容器使用反射来检索该参数化的类型,并将其与请求的

  • 问题内容: 为什么Java中的泛型只能用于类,而不能用于原始类型? 例如,这可以正常工作: 但这是不允许的: 问题答案: ava中的泛型是一个完全编译时的结构-编译器将所有泛型使用转换为正确的类型。这是为了保持与以前的JVM运行时的向后兼容性。 这个: 变成(大致): 因此,任何用作泛型的东西都必须可转换为Object(在此示例中返回),而原始类型则不是。因此它们不能用于泛型。

  • 为什么Java中的泛型可以处理类而不能处理基元类型? 例如,这个操作很好: 但这是不允许的: