在研究泛型时,我注意到泛型方法和泛型类型(类或接口)在类型引入语法上的一个差异使我感到困惑。
泛型方法的语法为
<T> void doStuff(T t) {
// Do stuff with T
}
文件上说
class Stuff<T> {
// Do stuff with T
T t;
}
为了彼此保持一致,我希望方法语法为void dostuff
,或者类型语法(for class)为class
,但事实显然并非如此。
为什么一个要介绍在前,另一个要介绍在后?
我主要以list
的形式使用泛型,并认为
可能看起来很奇怪,但这是一个主观的参数,此外对于方法也是这样。您可以调用dostuff
,类似于this。
在寻找技术解释时,我想在指定返回类型之前,可能必须将
引入方法,因为t
可能是返回类型,编译器可能无法这样向前看,但这听起来很奇怪,因为编译器很聪明。
我想除了“语言设计师只是这样做的”之外,还有一种解释,但我找不到。
答案确实存在于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的强大类型系统是学术探索和实践共