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

为什么是S和T而不是A和B?

邢雨华
2023-03-14

关于泛型类型,这可能是一个愚蠢的问题,但我找不到任何好的解释来解释泛型类型中遵循的命名约定。如果有一个类有两个泛型类型;Java程序员通常这样定义它:

class Foo<S extends Abc,T extends Pqr>{
   S sVar;
   T tVar;
}

为什么不做一些简单的事情,比如:

class Foo<A extends Abc,B extends Pqr>{
   A aVar;
   B bVar;
}

我只想问为什么要遵循这样的命名惯例?ST背后有什么原因吗?或者这个约定来自其他语言(比如c模板)?

共有2个答案

濮阳和泰
2023-03-14

引用OCP. Oracle的话。认证。专业。爪哇。SE.8.程序员。二、学习。导游。检查.1Z0809""

泛型的命名约定

类型参数可以根据需要命名。惯例是使用单大写字母,以表明它们不是真正的类名。以下是常用的字母:

  • E代表元素
  • 一个地图键的K
  • V表示地图值
  • N代表一个数字
  • T表示通用数据类型
  • S,U,V等多个泛型类型

这就是作者们在公约背后的论证。我猜S, U

邓阳炎
2023-03-14

从Java教程:

按照惯例,类型参数名称是单个大写字母。这与您已经知道的变量命名约定形成了鲜明的对比,并且有很好的理由:没有这种约定,很难区分类型变量和普通类或接口名称之间的区别。

最常用的类型参数名称有:

E - Element (used extensively by the Java Collections Framework)
K - Key
N - Number
T - Type
V - Value
S,U,V etc. - 2nd, 3rd, 4th types

您将在JavaSEAPI和本课程的其余部分中看到这些名称的使用。

特别注意:“如果没有这个约定,就很难区分类型变量和普通类或接口名之间的区别。”,我当然同意。

大多数人会使用TS,因为这是一种常见的做法,因此它对大多数其他人来说都是可读的。但是我要补充的是,我看到名称AB也被用作类的示例名称:class A{…} B类{…} 。使用它们作为类型变量名会使它们难以区分。

 类似资料:
  • 我试图理解背后的动机。如果已经存在类型类和,为什么有必要呢? 诚然,的实例是具体的类型,而的实例需要一个类型参数。(有关有用的解释,请参见Monoid vs MonadPlus。)但是你不能重写任何类型的约束吗 作为和的组合? 从。它的实施是: 我只能使用和实现它: 有人能澄清和之间的真正区别吗?

  • 如标题中所述,为什么 ARM 指令集仅在除法时区分有符号和无符号? SDIV和UDIV是可用的,但ADD、SUB和MUL并非如此。

  • 问题内容: 我是一名新的Java学习者。最近,我在阅读泛型编程,并对此感到困惑。 问题答案: 首先,这些是在不同上下文中使用的完全不同的构造。 是通用类型声明的一部分,例如 它使用类型参数声明泛型类型,并引入界限,因此必须是的子类型。 是带通配符的参数化类型,可以作为普通类型用于变量和方法声明等中: 变量声明诸如装置类型的该被参数化与一些亚型。 例如,给出此声明 您可以: 将的某些子类型分配给:

  • 问题内容: 我尝试了一些代码,使用XOR在Java中交换两个整数而不使用第三个变量。 这是我尝试的两个交换函数: 这段代码产生的输出是这样的: 我很好奇,为什么这样说: 与这个不同吗? 问题答案: 问题是评估的顺序: 参见JLS第15.26.2节 首先,对左操作数求值以产生一个变量。 如果该评估突然完成,则赋值表达式由于相同的原因而突然完成;右边的操作数不会被评估,并且不会发生赋值。 否则,将保存

  • 我一直在研究一些涉及将ASCII值转换为字符串的问题。 如果我使用此代码,我会以的形式输出,这是意料之中的。 但是,如果我这样更改代码: 当我尝试编译它时,会显示以下错误: 两种代码之间的唯一区别是,在第1种代码中,我使用的是t=I‘a’ ,在秒时,<代码>t=t i“a” 。 有人能告诉我第二段有什么问题吗?

  • 问题内容: 这一直使我感到困惑。看起来这样会更好: 比这个: 是否有特定原因? 问题答案: 这是因为任何可迭代对象都可以连接(例如,列表,元组,字典,集合),但是其内容和“连接器” 必须是 字符串。 例如: 使用字符串以外的其他东西会引发以下错误: