2014-10-09 55 views
0

我有一个方法签名,通过值对给定的地图进行排序。我的方法签名中称为什么是这些东西?泛型?

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>>部分。它的目的是定义什么KV是在方法的上下文中,是正确的?描述这个的恰当术语是什么?

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

+0

它们是['界类型parameters'](http://docs.oracle.com/javase/tutorial/java/generics /bounded.html)。 – 2014-10-09 03:34:41

+1

和一般[Java泛型教程](http://docs.oracle.com/javase/tutorial/java/generics/why.html) – aruisdante 2014-10-09 03:35:21

+0

@ PM77-1泛型之外是否使用了有界类型参数? – user2859406 2014-10-09 03:37:46

回答

0

是的,KV这里是通用的type parameters。更具体地说,@aruisdante在评论中指出,它们是有界的类型参数,因为它们指定了参数化类型必须满足的界限 - 即它们都必须实现Comparable。

看来你的问题是关于一般的参数,但不是专门针对有界参数。你绝对应该做一些阅读你自己,因为你问a big (and important) topic,但我会在介绍它采取了刺:

您可能熟悉不同的上下文中看到类型参数 - Map<String, Integer>:这里<String, Integer>也是类型参数,它们指定该映射中的键是String s,其中的值是Integer s。在方法声明的上下文中,类型参数指定返回类型是什么。这意味着你可以写generic methods每一个他们所谓的时间返回不同的类型,这取决于你在什么传:

注意,KV是两个方法本身和传入的参数类型参数:这告诉Java通过查看传入的映射的键和值类型来确定KV,并返回具有相同类型的映射。如果您致电sortByValue(fooMap)fooMapMap<String, FooType>,则它将返回一个地图<String, FooType>,并且如果fooMapMap<Integer, BarType>,则会返回Map<Integer, BarType>

更清晰的例子,考虑:

public <T> foobar(T t) { } 

这里的类型参数是无限的 - 这意味着T可以是任何类,所以你可以作为参数传递任何类的对象,并得到一个对象返回相同的类型。或

public<T> convertTo(Object o, Class<T> clazz) { } 

在这里,你可以通过任何类作为第一个参数的对象,并作为第二个参数Class对象,决定了T会。所以你可以这样做:

Fooclass s = convertTo(someObject, Fooclass.class) 

其中,你可能会想象,可以是一个非常有用的模式。

0

它们的参数化类型实例根据JLS Chapter 4. Types, Values, and Variables它说部分地与一个或多个类型的参数A1

泛型类或接口声明C(§8.1.2§9.1.2),... ,具有相应边界B1,...,Bn的An定义了一组参数化类型,对于每个可能的类型参数部分的调用都有一个参数化类型。

集合中的每个参数化类型的形式都是C,其中每个类型参数Ti覆盖所有类型,它们是相应边界中列出的所有类型的子类型。也就是说,对于Bi中每种结合类型的Si,Ti是Si [F1:= T1,...,Fn:= Tn]的子类型。

...

给出一个类型声明符紧跟一个类型参数列表,令C在符最终标识符。

0

我看到泛型的方式与我看到的类相同,只能用于类型和方法。他们概括了方法和数据结构,以本地支持所有有界类型。

而不是用相同的方法一遍又一遍地编码同一个对象,它说:“好吧,无论你在< >会告诉我什么课程,我都会明白。

假设你想要写在未知对象的数组的二进制搜索...你可以写以下特征:

public boolean binarySearch(Object[] array)... 

但是如果你想要的方法来通过只有某些类型的访问数据(可彼此比较的类型)?这是你将如何实现这一目标:

public <T extends Comparable<T>> boolean binarySearch(T[] array)... 

这是读这样的:“这是只接收包含对象数组的公共方法(我们会打电话给他们T)的实现Comparable接口相同的类(T)。

不仅类可以在泛型被延长,但接口以及(就像上面的例子)。

对于数据结构等

Vector<Integer> v; 

这意味着矢量v将只保存Integer对象而不保存其他类型。

通配符有边界的物体,例如同样的原则:

Vector<? extends Person> v; 

即矢量V将举办唯一的类人超一流的人。

Vector<?> v; 

大致相当于此

Vector<Object> v; 
相关问题