泛型

来源:互联网 发布:pupa丰胸霜怎么样 知乎 编辑:程序博客网 时间:2024/05/22 14:19

(接口)中的泛型:

class A<TV extends Number>

方法中的泛型

public <T, V extendsNumber> Map<T,V>) test(T t, List<? extends T> list, Vv)

泛型通配符?

类中的泛型可以在定义对象时传入从而确定,方法中的泛型应该通过传入的实参来让系统能够推断出来,通配符不应该出现在上面的红色部分中。

方法泛型的使用场景:

方法泛型能够反映出形参类型之间的依赖关系或者形参类型和返回值类型之间的依赖关系,这是使用方法泛型的唯一场景。

通配符?

首先通配符表示的是未知类型,而不是全部,例如List<? extends Number>表示的是不知道是哪一个类型,仅仅知道是Number的子类或者Number,而不是表示所有Number的子类。例如有一个List<? extends Object> list,那么实际是仅仅能够向这个listadd的是null,而不能add任何其他对象的实例,因为不知道到底是哪一个。通配符只能出现在List<? extends Number> 这种格式中,而不能单独出现,例如<? extends Number>。能使用通配符的地方不要使用方法泛型。

 

声明泛型:

最上面的红色部分可以理解为是声明泛型,不能使用通配符,声明部分声明了的就可以在其他地方使用了。

个人感觉局部变量使用泛型的意义不大。

 

上限: extends < T extends Number> TNumber本身或者子类

下限: super  < T superInteger> TInteger本身或者超类

 

int binarySearch(List<?extends Comparable<? super T>> list, T key)

List中的泛型类型为A,那么定义A的时候实现了Comparable<B>,其中BT的父类,例如TString,由一个类实现了Comparable<Object>,那么这个类就符合要求。

 

关于通配符看几个例子个人感觉 ? extends Object是一样的

public Object test(ArrayList<?> list){//没有问题return list.get(0);}public void test(ArrayList<?> list){//下面会发生错误list.add(new Object());//此时能add的只有nulllist.add(null);}


0 0