当前位置: 首页 > 知识库问答 >
问题:

为什么泛型方法和泛型类型有不同的类型引入语法?

丁文轩
2023-03-14

在研究泛型时,我注意到泛型方法和泛型类型(类或接口)在类型引入语法上的一个差异使我感到困惑。

泛型方法的语法为

<T> void doStuff(T t) {
    // Do stuff with T
}

文件上说

class Stuff<T> {
    // Do stuff with T
    T t;
}

为了彼此保持一致,我希望方法语法为
void dostuff (T T){} ,或者类型语法(for class)为class stuff{} ,但事实显然并非如此。

为什么一个要介绍在前,另一个要介绍在后?

我主要以list 的形式使用泛型,并认为 list 可能看起来很奇怪,但这是一个主观的参数,此外对于方法也是这样。您可以调用dostuff,类似于this。 dostuff(“一个字符串”);

在寻找技术解释时,我想在指定返回类型之前,可能必须将 引入方法,因为t可能是返回类型,编译器可能无法这样向前看,但这听起来很奇怪,因为编译器很聪明。

我想除了“语言设计师只是这样做的”之外,还有一种解释,但我找不到。

共有1个答案

郎弘业
2023-03-14

答案确实存在于GJ规范中,该规范已被链接,引用自该文件,第14页:

在方法名之前传递参数的约定是解析约束所必需的:使用更常规的“方法名之后是类型参数”约定,表达式f(a (d)) 将有两个可能的解析。

f(a (d)) 可以解析为f(a d) (通过比较将两个布尔值传递给f)或f(a (d)) (将类型参数b和c和值参数d传递给f的a调用)。我认为这也可能是scala选择使用[]而不是<>来处理泛型的原因。

 类似资料:
  • 这个问题是在泛型关联类型在Rust中可用之前提出的,尽管它们是被提出和开发的。 我的理解是,特征泛型和关联类型在它们可以绑定到结构的类型数量上有所不同。 关联类型仅绑定1个类型: 泛型关联类型是这两种类型的混合。它们绑定到一个类型,正好有一个关联的生成器,而生成器又可以关联任何数量的类型。那么前面示例中的和这个泛型关联类型有什么区别呢?

  • 我想说得具体一点。我有一个名为Result的类和一个名为Result的派生类 这些类在方法中用作返回类型。为此,我创建了这个helper类: 正如您所看到的,上面的代码对于成功有两种返回类型,一种是如果您不想返回任何东西,另一种是如果您想返回一些东西,但是失败的结果永远不会返回什么东西。这是不必要的,只是一个错误消息。这使我想到以下问题:当我想创建一个可以使用返回类型返回Success,而不使用返

  • 我在覆盖接口中声明的方法时遇到了一些问题,该方法使用泛型参数作为其异常,并使用泛型作为其参数之一。为了说明,我编写了以下代码接口 通过javac运行,我得到 请注意,在接口中,metodoA和metodoB之间的唯一区别在于它们的参数。 为什么Implementadora(Implementadora)的metodoB(metodoB)(代码)不重写Interfaz(代码),但重写metodoB(

  • 问题内容: 如果在Java中创建泛型类(该类具有泛型类型参数),则可以使用泛型方法(该方法带有泛型类型参数)吗? 考虑以下示例: 正如您对通用方法所期望的那样,我可以使用任何对象调用的实例: 但是,如果我尝试使用 不 指定泛型类型的实例,则无论传入什么,我都会调用返回, 奇怪的是,如果返回类型是通用类,它将编译(例如(实际上,这可以解释-参见下面的答案)): 此外,如果输入通用类,即使仅使用通配符

  • 如果在Java中创建泛型类(该类具有泛型类型参数),是否可以使用泛型方法(该方法采用泛型类型参数)? 考虑下面的例子: 正如您所期望的那样,对于任何对象,的实例,我都可以调用: 但是,如果我试图使用的实例而不指定泛型类型,那么调用将返回一个

  • 类型和泛型 类型系统的首要目的是检测程序错误。类型系统有效的提供了一个静态检测的有限形式,允许我们代码中明确某种类型的变量并且编译器可以验证。类型系统当然也提供了其他好处,但错误检测是他存在的理由(Raison d’Être) 我们使用类型系统应当反映这一目标,但我们必须考虑到读者(译注:读你代码的人):明智地使用类型可以增加清晰度,而过份聪明只会迷乱。 Scala的强大类型系统是学术探索和实践共