【泛型】_通配符笔记
分类: Java【泛型】_通配符笔记
本章目标:
掌握通配符“?”的使用
掌握受限泛型的设置
掌握泛型与子类继承的限制
3.1 匹配任意类型的通配符
匹配任意类型的通配符
在开发中对象的引用传递是最常见的,但是如果在泛型类的操作中,在进行引用传递的时候泛型类型必须匹配才可以传递,否则是无法传递的。
- class Info<T>{
- private T var; //定义泛型变量
- public void setVar(T var){
- this.var = var;
- }
- public T getVar(){
- return this.var;
- }
- public String toString(){
- return this.var.toString();
- }
- }
- public class GenericsDemo12{
- public static void main(String[] args){
- Info<String> i = new Info<String>();
- i.setVar("MLDN"); //设置内容
- fun(i);
- }
- public static void fun(Info<Object> temp){
- System.out.println("内容:"+temp);
- }
- }
编译时错误:
泛型对象进行引用传递的时候,类型必须一致,如果现在非要传递,则可以将fun方法中Info参数的泛型取消掉。
- class Info<T>{
- private T var; //定义泛型变量
- public void setVar(T var){
- this.var = var;
- }
- public T getVar(){
- return this.var;
- }
- public String toString(){
- return this.var.toString();
- }
- }
- public class GenericsDemo12{
- public static void main(String[] args){
- Info<String> i = new Info<String>();
- i.setVar("MLDN"); //设置内容
- fun(i);
- }
- public static void fun(Info temp){
- System.out.println("内容:"+temp);
- }
- }
以上确实完成了改进的功能,但是,代码似乎有些不是很妥当,毕竟之前已经指定过泛型了。
- class Info<T>{
- private T var; //定义泛型变量
- public void setVar(T var){
- this.var = var;
- }
- public T getVar(){
- return this.var;
- }
- public String toString(){
- return this.var.toString();
- }
- }
- public class GenericsDemo12{
- public static void main(String[] args){
- Info<String> i = new Info<String>();
- i.setVar("MLDN"); //设置内容
- fun(i);
- }
- public static void fun(Info<?> temp){
- System.out.println("内容:"+temp);
- }
- }
如果使用?意味着可以接收任意的内容,但是此内容却无法直接使用<?>修饰的泛型对象时行修改。
- class Info<T>{
- private T var; //定义泛型变量
- public void setVar(T var){
- this.var = var;
- }
- public T getVar(){
- return this.var;
- }
- public String toString(){
- return this.var.toString();
- }
- }
- public class GenericsDemo12{
- public static void main(String[] args){
- Info<?> i = new Info<String>();
- i.setVar("MLDN"); //设置内容
- }
- }
在使用<?>只能接收,但是不能修改。
3.2、受限泛型
之前设置泛型类型的时候,实际上都是可以任意设置的,只要是类就可以设置。但是在java的泛型中可以指定一个泛型的上限和下限。
设置上限:
声明对象:类名称<? extends 类> 对象名称
定义类:[访问权限] 类名称<泛型标识 extends 类>{}
设置下限:
声明对象:类名称<? super 类> 对象名称
定义类:[访问权限] 类名称<泛型标识 super 类>{}
3.2.1、设置上限
- class Info<T>{
- private T var ; // 定义泛型变量
- public void setVar(T var){
- this.var = var ;
- }
- public T getVar(){
- return this.var ;
- }
- public String toString(){ // 直接打印
- return this.var.toString() ;
- }
- };
- public class GenericsDemo18{
- public static void main(String args[]){
- Info<String> i1 = new Info<String>() ; // 声明String的泛型对象
- i1.setVar("hello") ;
- fun(i1) ;
- }
- public static void fun(Info<? extends Number> temp){ // 只能接收Number及其Number的子类
- System.out.print(temp + "、") ;
- }
- };
- class Info<T extends Number>{ // 此处泛型只能是数字类型
- private T var ; // 定义泛型变量
- public void setVar(T var){
- this.var = var ;
- }
- public T getVar(){
- return this.var ;
- }
- public String toString(){ // 直接打印
- return this.var.toString() ;
- }
- };
- public class GenericsDemo19{
- public static void main(String args[]){
- Info<Integer> i1 = new Info<Integer>() ; // 声明Integer的泛型对象
- }
- };
- class Info<T extends Number>{ // 此处泛型只能是数字类型
- private T var ; // 定义泛型变量
- public void setVar(T var){
- this.var = var ;
- }
- public T getVar(){
- return this.var ;
- }
- public String toString(){ // 直接打印
- return this.var.toString() ;
- }
- };
- public class GenericsDemo20{
- public static void main(String args[]){
- Info<String> i1 = new Info<String>() ; // 声明Integer的泛型对象
- }
- };
3.2.2、设置下限
- class Info<T>{
- private T var ; // 定义泛型变量
- public void setVar(T var){
- this.var = var ;
- }
- public T getVar(){
- return this.var ;
- }
- public String toString(){ // 直接打印
- return this.var.toString() ;
- }
- };
- public class GenericsDemo21{
- public static void main(String args[]){
- Info<String> i1 = new Info<String>() ; // 声明String的泛型对象
- Info<Object> i2 = new Info<Object>() ; // 声明Object的泛型对象
- i1.setVar("hello") ;
- i2.setVar(new Object()) ;
- fun(i1) ;
- fun(i2) ;
- }
- public static void fun(Info<? super String> temp){ // 只能接收String或Object类型的泛型
- System.out.print(temp + "、") ;
- }
- };
- class Info<T>{
- private T var ; // 定义泛型变量
- public void setVar(T var){
- this.var = var ;
- }
- public T getVar(){
- return this.var ;
- }
- public String toString(){ // 直接打印
- return this.var.toString() ;
- }
- };
- public class GenericsDemo22{
- public static void main(String args[]){
- Info<Integer> i1 = new Info<Integer>() ; // 声明Integer的泛型对象
- i1.setVar(30) ;
- fun(i1) ;
- }
- public static void fun(Info<? super String> temp){ // 只能接收String或Object类型的泛型
- System.out.print(temp + "、") ;
- }
- };
3.3、解释:泛型与子类继承的限制
一个类的子类可以通过对象多态性,为其父类实例化,但是在泛型操作中,子类的泛型类型是无法使用父类的泛型类型接收的,例如:Info<String>不能使用Info<Object>接收
- class Info<T>{
- private T var ; // 定义泛型变量
- public void setVar(T var){
- this.var = var ;
- }
- public T getVar(){
- return this.var ;
- }
- public String toString(){ // 直接打印
- return this.var.toString() ;
- }
- };
- public class GenericsDemo23{
- public static void main(String args[]){
- Info<String> i1 = new Info<String>() ; // 泛型类型为String
- Info<Object> i2 = null ;
- i2 = i1 ;
- }
- };
GenericsDemo23.java:17: 不兼容的类型
找到: Info<java.lang.String>
需要: Info<java.lang.Object>
i2 = i1 ;
^
1 错误