学习笔记:java的泛型

泛型

泛型,JDK1.5新加入的,解决数据类型的安全性问题,其主要原理是在类声明时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这样在类声明或实例化时只要指定好需要的具体的类型即可。
Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁、健壮。
• Java中的泛型,只在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行时阶段。
1.对象实例化时不指定泛型,默认为:Object。
2.泛型不同的引用不能相互赋值。

//定义一个泛型接口
interface Generator<T> {
    
    
T next();
}
  • 未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需将泛型的声明也一起加到类中
  • 即:class FruitGenerator implements Generator{
  • 如果不声明泛型,如:class FruitGenerator implements Generator,编译器会报错:“Unknown class”
 */
class FruitGenerator<T> implements Generator<T>{
    
    
    @Override
    public T next() {
    
    
        return null;
    }
}

/**
  • 传入泛型实参时:
  • 定义一个生产器实现这个接口,虽然我们只创建了一个泛型接口Generator
  • 但是我们可以为T传入无数个实参,形成无数种类型的Generator接口。
  • 在实现类实现泛型接口时,如已将泛型类型传入实参类型,则所有使用泛型的地方都要替换成传入的实参类型
  • 即:Generator,public T next();中的的T都要替换成传入的String类型。
 */
class FruitGenerator implements Generator<String> {
    
    
@Override
public String next() {
    
    
// TODO Auto-generated method stub
return null;
}
}

泛型方法 方法,也可以被泛型化,不管此时定义在其中的类是不是泛型化的。在泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据的类型。
泛型方法的格式:

 public class DAO {
    
    
	public <E>  void show(E e){
    
    
		System.out.println(e.toString());
	}
	public <T> T show1(T t){
    
    
        		return t;
    	}
  }

/**
 * 泛型方法与可变参数
 * @param args
 */
public <T> void printMsg( T... args){
    
    
    for(T t : args){
    
    
       System.out.println("泛型测试 ,t is " + t);
    }
}
/**
 * 静态方法无法访问类上定义的泛型;
 * 如果静态方法操作的引用数据类型不确定的时候,必须要将泛型定义在方法上
 * @author lby
 * @param <T>
 */
class StaticGenerator<T> {
    
    
    /**
     * 如果在类中定义使用泛型的静态方法,需要添加额外的泛型声明(将这个方法定义成泛型方法)
     * 即使静态方法要使用泛型类中已经声明过的泛型也不可以。
     * 如:public static void show(T t){..},此时编译器会提示错误信息:
          "StaticGenerator cannot be refrenced from static context"
     */
    public static <T> void show(T t){
    
    
    }
}

通配符

/**
 * 不确定集合中的元素具体的数据类型
 * 使用?表示所有类型
 * @param list
 */
public void test(List<?> list){
    
    
System.out.println(list);
}

举例:

<? extends Person> (无穷小 , Person]只允许泛型为Person及Person子类的引用调用 <? super Person > [Person , 无穷大)只允许泛型为Person及Person父类的引用调用 <? extends Comparable> 只允许泛型为实 现Comparable接口的实现类的引用调用

猜你喜欢

转载自blog.csdn.net/qq_44909275/article/details/105626656