泛型接口和类
泛型类和接口上面已经演示过了,定义方式类似class A;这样。需要注意一点,在实现泛型接口时可以选择传入泛型实参或者不传实参,传入实参时实现类不需要声明为泛型,实现类中所有使用泛型的地方都要转为实参。不传入实参时,实现类也要声明为泛型。
泛型方法
泛型方法能够使方法独立与类而产生变化,Java编程思想一书中有一个指导原则,无论何时,只要能做到,就应该尽量使用泛型方法。也就是说,如果使用泛型方法可以取代将整个类泛型化,那么就应该只使用泛型方法。另外,对于一个static的方法而言,无法访问泛型类的类型参数,所以,如果static方法需要使用泛型能力,就必须使其成为泛型方法。
看一个简单例子:
首先上面这个类是普通类,并不是一个泛型类。这个类有一个泛型方法,这个方法可以静态的也可以是静态的,我这里选择用静态方法。方法get很简单,就是打印出参数的类型。在定义方法的时候,并不知道要传入的方法类型,只有在编译时期根据传入的参数类型,可以推断出泛型的实参,例如传入的1,编译器可以推断出泛型参数类型为Integer,传入“1”,编译器可以推断出泛型参数类型为String,传入1.0编译器可以推断出泛型参数类型为Double。这个叫做参数类型推断。
看下上面代码执行结果:
代码的执行结果证明了泛型方法不需要显式的指明参数类型,可以推断参数类型。类型推断只对赋值操作有效,其他时候并不起作用。如果你将一个泛型方法调用的结果(例如New.map())作为参数,传递给另一个方法,这时编译器并不会执行类型推断。
综上所述,当使用泛型类时候,必须在创建对象的时候指定类型的参数值,而使用泛型方法的时候,通常不必指明参数类型,因为编译器会找出具体的类型。
通配符
在定义泛型过程中会经常遇到不同的通配符,例如T,E,K,V,?等,这些其实没什么区别,但是默认情况下有一些约定:
T表示一个java类型。
E表示元素Element,表示容器中的元素。
K V(key Value)分别代表java键值中的Key Value。
?表示不确定的java类型。
通配符一般可以分为无界通配符,上界通配符和下界通配符。
定义方式如下:
但是上界通配符和下届通配符是具有局限性的。在上图的list中,上界通配符定义的list只能get数据,且类型为Fruit,add的时候会报错。下界通配符定义的list只能add数据,get数据返回的只能是object,详细信息会全部丢失。
以上就是动力节点java培训机构的小编针对“Java泛型有哪些?怎么用?”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习