Java 我的方法签名中的这些东西叫什么?仿制药?

Java 我的方法签名中的这些东西叫什么?仿制药?,java,generics,Java,Generics,我有一个方法签名,它按值对给定的映射进行排序 public static <K extends Comparable<K>, V extends Comparable<V>> Map<K,V> sortByValues(Map<K,V> map){ 公共静态映射排序值(映射映射){ 我试图理解这个方法签名中的术语。我得到了公共,静态,映射,函数名和参数部分 我的困惑在于部分。它的目的是定义方法上下文中的K和V是什么,对吗?描述这一点

我有一个方法签名,它按值对给定的映射进行排序

public static <K extends Comparable<K>, V extends Comparable<V>> Map<K,V> sortByValues(Map<K,V> map){
公共静态映射排序值(映射映射){
我试图理解这个方法签名中的术语。我得到了
公共
静态
映射
,函数名和参数部分

我的困惑在于
部分。它的目的是定义方法上下文中的
K
V
是什么,对吗?描述这一点的合适术语是什么


任何关于泛型的推荐读物或文章?

是的,
K
V
这里都是泛型的。更具体地说,正如@Aruistante在评论中指出的,它们是有界类型参数,因为它们指定了参数化类型必须满足的边界,即它们都必须实现可比性

看起来你的问题是关于一般的参数,而不是关于有界参数。正如你所问的,你肯定应该自己读一些书,但我会尝试介绍一下:

您可能熟悉在不同的上下文中看到类型参数-
Map
这里还有类型参数,它们指定此映射中的键是
String
s,其中的值是
Integer
s。在方法声明的上下文中,类型参数指定返回类型be。这意味着您可以根据传入的内容编写每次调用时返回不同类型的代码:

请注意,
K
V
是方法本身和传入参数上的类型参数:这告诉Java通过查看传入的映射的键和值类型来确定
K
V
,返回具有相同类型的映射。如果调用
sortByValue(fooMap)
fooMap
是一个
Map
,它将返回一个Map
,如果
fooMap
是一个
Map
,您将返回一个
Map

要获得更清晰的示例,请考虑:

public <T> foobar(T t) {  }
在这里,您可以将任何类的对象作为第一个参数传入,将
class
对象作为第二个参数传入,该对象确定
T
将是什么。因此,您可以执行以下操作:

Fooclass s = convertTo(someObject, Fooclass.class) 
正如您可能想象的那样,这是一种非常有用的模式。

它们是参数化类型的示例,根据

具有一个或多个类型参数A1,…,且具有相应边界B1,…,Bn的泛型类或接口声明C(,)定义了一组参数化类型,一个用于类型参数节的每个可能调用

集合中的每个参数化类型的形式都是C,其中每个类型参数Ti都覆盖对应绑定中列出的所有类型的子类型的所有类型。也就是说,对于Bi中的每个绑定类型Si,Ti都是Si的子类型[F1:=T1,…,Fn:=Tn]

给定紧跟类型参数列表的类型声明说明符,让C作为说明符中的最终标识符


我看待泛型的方式与我看待类的方式相同,只针对类型和方法。泛型泛化方法和数据结构,以原生方式支持所有有界类型

它不是一遍又一遍地用同样的方法对同一个对象进行编码,而是说“好吧,伙计们,不管你们在
中告诉我什么类,我都会理解”

假设要在未知对象数组中写入二进制搜索…可以写入以下签名:

public boolean binarySearch(Object[] array)...
但是,如果您只想让特定类型的数据(可以相互比较的类型)访问该方法,该怎么办呢

public <T extends Comparable<T>> boolean binarySearch(T[] array)...
公共布尔二进制搜索(T[]数组)。。。
这是这样理解的:“这是一个公共方法,它只接收包含对象(我们称之为T)的数组,这些对象实现了同一类(T)的可比较接口

不仅类可以在泛型中扩展,接口也可以扩展(就像上面的例子)

对于数据结构,如

Vector<Integer> v;
向量v; 这意味着向量v将只包含整数对象,而不包含其他类型的对象

通配符在绑定对象时具有相同的原则,例如:

Vector<? extends Person> v;
向量v; 大致相当于这个

Vector<Object> v;
向量v;
它们是。general@PM77-1是否在泛型之外使用了有界类型参数?您是否遵循了我提供的链接?同样根据您的方法名称,似乎不需要将键类型与comparable绑定。仅使用“”就足够了。
Vector<?> v;
Vector<Object> v;