深入了解--Java的泛型

泛型

泛型从JDK 1.5 之后追加到Java语言里面的,其主要目的是为了解决ClassCastException的问题,在进行对象的向下转型时永远都可能存在有安全隐患,而Java希望通过泛型可以慢慢解决掉此类问题。
所有数据类型都可以用Object接受,但正因于此,当拆箱时,从里面获得数据会有Object向下转型,Object涵盖的范围很广,执行代码时就会出现ClassCastException异常,但编译的时候又往往不会报错…所以不建议Object向下转型。从而引出泛型…

泛型的基本定义

泛型的本质 :类中的属性或方法的参数与返回值的类型可以由对象实例化的时候动态决定。
在类定义的时候明确的定义占位符(泛型标记)。

class Point <T> {
    
    // T是Type的简写,可以定义多个泛型
	private T X ;
	public void setX(T x) {
    
    
		this.x = x;
	}
	public T getX() {
    
    
		return this .X ;
	}
}
public class JavaDemo {
    
    
	public static void main (String args []) {
    
    
		Point<Integer> point = new Point <Integer> () ;//泛型设置为Integer(不能使用int,只能使用包装类)
		//第一步:根据需求进行内容的设置
		point.setx (10) ;//自动装箱
		//第二步:从里面获取数据
		int X = point.getX() ;
		System.out.println("x坐标:"+ x);
}
}

泛型的使用注意点:

  • 泛型之中只允许设置引用类型,如果现在要操作基本类型必须使用包装类;
  • 从JDK 1.7开始,泛型对象实例化可以简化为“Point Integer> point = new Point<>()”;

泛型通配符

通配符的产生在于,泛型引用传递是出现的问题,具体代码分析:

class Message <T> {
    
    
	private T content ;
	public void setContent(T content) {
    
    
		this. content = content ;
	}
	public T getContent() {
    
    
		return this . content ;
	}
}
public class JavaDemo {
    
    
	public static void main(String args[]) {
    
    
		Message<String> msg = new Message<String>() ;
		msg.setContent( "wWW.baidu.com") ;
		fun(msg) ; // 引用传递
		/* 1、此时调用的fun只能处理泛型为String类型的,如果为Double或者Integer都不能实现引用传递;
		   2、此时fun的参数泛型如果不设置,变成“fun(Message temp)”,虽然解决了第一条的问题,但是
		   	  如果在fun的方法里面加入一句“temp.setContent(1.1);”就会导致输出结果全部变成1.1,mian方法
		      里面的setContent不再有用。所以第二条的隐患在于方法里面可能会对数据进行修改
	    */
	}
	public static void fun(Message<String> temp){
    
    
		System.out.println(temp . getContent()) ;
	}
}

根据以上代码分析,就有了通配符的产生,上面的fun方法可以这么写:

public static void fun(Message<?> temp) { }

还有另外两种通配符

  • ?extends 类 ”:设置泛型的上限
    例如:定义“? extends Number”:表示该泛型类型只允许设置Number或者Number的子类
  • ?super 类 ”:设置泛型的下限
    例如:定义“? super String":只能够使用String或其父类

泛型接口

泛型除了在类上使用还可以在接口上使用

interface IMessage < T >{
      public String echo(T t);
}

泛型接口的子类有两种实现方式:

  • 在子类中继续设置泛型定义

class MessageImpl< S > implements IMessage< S > {
        public String echo(S t) {
                return "[ ECHO] "+ t;
        }
}

  • 在子类实现父接口的时候直接定义出具体泛型类型

class MessageImpl implements IMessage< String> {
        public String echo(String t) {
                return "[ ECHO] "+ t;
        }
}

泛型方法

将泛型标记在方法上,泛型方法不一定只能出现在泛型类或接口中。

public class JavaDemo {
    
    
    public static void main (String args []) {
    
    
		Integer num [] = fun(1,2,3) ;//传入了整数,泛型类型就是Integer
		for (int temp : num) {
    
    
		System. out.print(temp + "、") ;
	}
	public static <T> T[] fun(T ... args) {
    
    
		return args ;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_43337254/article/details/107894575