java入门基础学习----泛型

概念:泛型就是参数化类型,使用广泛的类型

作用:

       1. 安全:在编译的时候检查类型安全;  2.省心:所有的强制转换都是自动和隐式的,提高代码的重用率

 

一、  泛型类:声明时使用泛型
  字母:
  T Type 表示类型
  K V 分别代表兼职中的Key Value
  E 代表Element
  使用是确定类型 
  注意:
  1.泛型只能使用引用类型,不能基本类型
  2.泛型声明时字母不能使用在 静态属性|静态方法上

 

 接口中泛型字母只能使用在方法中,不能使用在全局常量中

 

  泛型方法<>,返回类型前面
  只能访问对象的信息,不能修改信息(因为类型不确定)

 

二、抽象类继承

package com.kennosaur.gen03;
/**
 * 父类为泛型类
 * 1.属性
 * 2.方法
 * 
 * 要么同时擦除,要么子类大于等于父类的类型,
 * 不能子类擦除,父类泛型
 * 1.属性类型
 *   父类中,随父类而定
 *   子类中,随子类而定
 * 2.方法重写
 *   随父类而定
 * @author Administrator
 *
 * @param 
 */
public abstract class Father {
	T name;
	public abstract void test(T t);
}

/**
 * 子类指定具体类型
 * 属性类型为具体类型
 * 方法同理
 */
class Child1 extends Father{
	String t1;
	@Override
	public void test(String t) {
		t1 = this.name;		
	}	
}
/**
 * 子类为泛型类,类型在使用时确定
 *
 *
 */
class Child2 extends Father{
	T t2;
	@Override
	public void test(T t) {
				
	}	
}

/**
 * 子类为泛型,父类不指定类型---泛型的擦除,使用Object替换
 */
class Child3 extends Father{

	@Override
	public void test(Object t) {
				
	}	
}

/**
 * 子类与父类同时擦除
 */
class Child4 extends Father{

	@Override
	public void test(Object t) {
				
	}	
}

/**
 * 错误:子类擦除,父类使用泛型
 */
//class Child5 extends Father{
//
//	@Override
//	public void test(T t) {
//		
//	}
//
//}

三、接口泛型

package com.kennosaur.gen03;
/**
 * 泛型接口:与继承同理
 * 重写方法随父类而定
 * @author Administrator
 *
 * @param 
 */
public interface Comparable {
	void compare(T t);
}
//声明子类指定具体类型
class Comp implements Comparable{

	@Override
	public void compare(Integer t) {
		// TODO Auto-generated method stub
		
	}
	
}
//擦除
class Comp1 implements Comparable{

	@Override
	public void compare(Object t) {
		// TODO Auto-generated method stub
		
	}
	
}

//父类擦除,子类泛型
class Comp2 implements Comparable{

	@Override
	public void compare(Object t) {
		// TODO Auto-generated method stub
		
	}
	
}

//子类泛型>=父类泛型
class Comp3 implements Comparable{

	@Override
	public void compare(T t) {
		// TODO Auto-generated method stub
		
	}
	
}

//父类泛型,子类擦除----错误
//class Comp4 implements Comparable{
//	
//}

 

四、泛型的擦除

1.继承|实现声明时不指定类型;

2.使用时不指定类型

统一Object对待

 

五、泛型没有多态

通配符?

package com.kennosaur.gen04;

import com.kennosaur.gen01.App;

/**
 * ?的使用:声明类型|声明方法上,不能声明类或使用时
 * ? extends: <=上限, 指定类型为子类或自身
 * ? super :  >=下限,指定类型为自身或父类
 * @author Administrator
 *
 */
public class Student {
	 T score;
	 
	 public static void main(String[] args) {
		 Student stu = new Student();
		 test(new Student());
		 test2(new Student());
		 //test3(new Student());   错误,泛型没有多态
		 
		 //test4(new Student());   X错误
		 
//		 stu = new Student();
//		 test4(stu);                      X错误
		 
		 test4(new Student());
		 test4(new Student());
	 }
	 
	 public static void test(Student stu) {
		 
	 }
	 
	 public static void test2(Student stu) {
			 
	 }
	 public static void test3(Student stu) {
		 
	 }
	 
	 public static void test4(Student stu) {
		 
	 }
} 
  

泛型的嵌套:使用时从外到内,一层层拆分

 

泛型数组是不存在的

    没有泛型数组,不能创建泛型数组

    可以只有声明,可以使用“?”声明,没有实际意义

 

 

 

你可能感兴趣的:(JAVA)