[英]What are these things in my method signature called? Generics?
我有一个方法签名,可以按值对给定的映射进行排序。
public static <K extends Comparable<K>, V extends Comparable<V>> Map<K,V> sortByValues(Map<K,V> map){
我试图了解此方法签名中事物的术语。 我得到public
, static
, Map<K,V>
,函数名称和参数部分。
我的困惑是在<K extends Comparable<K>, V extends Comparable<V>>
部分。 目的是定义方法上下文中的K
和V
,对吗? 用什么恰当的术语来形容呢?
任何有关泛型的推荐读物或文章?
是的,这里的K
和V
是通用类型参数 。 更具体地说,正如@aruisdante在注释中指出的那样,它们是有界类型参数,因为它们指定了参数化类型必须满足的界限-即它们都必须实现Comparable。
似乎您的问题是关于参数的,而不是关于有界参数的。 当您问到一个重要的(且很重要的)主题时 ,您绝对应该自己做一些阅读,但是在介绍这个主题时 ,我会稍作努力:
您可能对在不同上下文中看到类型参数很熟悉-Map Map<String, Integer>
: <String, Integer>
此处也是类型参数,它们指定此映射中的键为String
并且其中的值为Integer
s。 在方法声明的上下文中,类型参数指定返回类型是什么。 这意味着您可以编写泛型方法 ,这些泛型方法每次调用时都会返回不同的类型,具体取决于您传入的内容:
请注意, K
和V
都是方法本身和传入的参数上的类型参数:这告诉Java通过查看传入的映射的键和值类型来确定K
和V
,并返回具有相同值的映射类型。 如果调用sortByValue(fooMap)
并且fooMap
是Map<String, FooType>
,它将返回Map <String, FooType>
;如果fooMap
是Map<Integer, BarType>
, fooMap
获得Map<Integer, BarType>
返回。
对于更清晰的示例,请考虑:
public <T> foobar(T t) { }
这里的type参数是无界的-意味着T
可以是任何类,因此您可以将任何类的对象作为参数传递,并获得返回相同类型的对象。 要么
public<T> convertTo(Object o, Class<T> clazz) { }
在这里,您可以传入任何类的对象作为第一个参数,而作为第二个参数传入确定T
的Class
对象。 因此,您可以执行以下操作:
Fooclass s = convertTo(someObject, Fooclass.class)
您可能会想到,这可能是非常有用的模式。
我看到泛型的方式与我看到类的方式相同,仅适用于类型和方法。 它们概括了方法和数据结构以本地支持所有有界类型。
而不是一遍又一遍地用相同的方法编码相同的对象,而是说“好吧,不管您在< >
告诉我什么类,我都会理解的”。
假设您要在未知对象数组中编写二进制搜索...,您可以编写以下签名:
public boolean binarySearch(Object[] array)...
但是,如果您希望仅某些类型的数据(可相互比较的类型)可以访问该方法,该怎么办? 这是您将如何实现的方法:
public <T extends Comparable<T>> boolean binarySearch(T[] array)...
如下所示:“这是一个公共方法,它仅接收包含对象的数组(我们将它们称为T),这些对象将Comparable接口实现为相同的类(T)。
不仅可以在泛型中扩展类,而且还可以扩展接口(就像上面的示例一样)。
对于像这样的数据结构
Vector<Integer> v;
这意味着Vector v将仅保存Integer对象,而不包含其他类型。
通配符在限制对象方面具有相同的原理,例如:
Vector<? extends Person> v;
该向量v将仅容纳超类为Person的类。
这个
Vector<?> v;
大致相当于
Vector<Object> v;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.