DAY11:尚学堂高琪JAVA(116~118)

泛型

概念:泛型就是参数化类型,使用广泛的类型。
起因:数据类型不明确:

  • 装入的数据类型都被当作Object对待,从而丢失自己的实际类型
  • 获取数据时往往需要转型,效率低,容易产生错误

作用:

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

泛型类:

package fanxing;

//116 泛型 -->泛型类
/**
 * 注意: 1.泛型只能使用引用类型,不能基本类型 
 * 2.泛型声明时字母不能使用在静态属性,方法上 
 * (泛型是在使用时候确定的,而静态属性和方法出现在编译时)
 */
public class Student<T1, T2> {
	private T1 javascore;
	private T2 pyscore;

	public T1 getJavascore() {
		return javascore;
	}

	public void setJavascore(T1 javascore) {
		this.javascore = javascore;
	}

	public T2 getPyscore() {
		return pyscore;
	}

	public void setPyscore(T2 pyscore) {
		this.pyscore = pyscore;
	}

	public static void main(String[] args) {
		// 使用时候指定类型(引用类型)
		Student<String, Integer> s1 = new Student<String, Integer>();
		// 1.安全:类型检查
		s1.setJavascore("优秀");
		s1.setPyscore(88);
		// 2.省心:类型转换
		String java=s1.getJavascore();
		int py = s1.getPyscore();
		
		System.out.println(java);
		System.out.println(py);

	}

}

泛型接口

package fanxing;

/*
 * 116 泛型 -->泛型接口
 * 接口中泛型字母只能用在方法中,不能用在全局常量中
 * 
 * */
public interface Fanxingjiekou<T> {
	void jiekou(T t);
}

泛型方法

package fanxing;

/*
 * 116 泛型 -->泛型方法
 * 修饰符 <> 返回值类型
 * 只能访问对象信息,不能修改
 * */
public class Test {

	public static void main(String[] args) {
		test(123);
		test("aaa");
	}

	public static <T> void test(T a) {
		System.out.println(a);
	}

}

泛型的继承
继承|实现
1.保留 -->泛型子类
2不.保留 -->按需实现,可以是泛型子类,也可以非泛型子类
属性和方法:随声明位置而定
擦除:使用继承实现 没有指定类型,类似于Object

package fanxing;
//117 泛型的继承

public abstract class Father<T1, T2> {
	T1 age;

	public abstract void test(T2 name);

}

// * 保留 -->泛型子类
// 1.全部保留
class C1<T2, T1, A, B> extends Father<T1, T2> {
	@Override
	public void test(T2 name) {

	}
}

// 2.部分保留
class C2<T2> extends Father<Integer, T2> {
	@Override
	public void test(T2 name) {

	}
}

// * 不保留
// 1.具体类型 -->按需实现
class C3 extends Father<Integer, String> {
	@Override
	public void test(String name) {

	}
}
// 2.没有类型 擦除

class C4 extends Father {
	@Override
	public void test(Object name) {

	}
}

泛型通配符

package fanxing;
import java.util.ArrayList;
import java.util.List;
//118 通配符,类型不确定,用于声明变量,形参上
//不能用在
//1.创建对象
//2.创建泛型类,泛型方法,泛型接口上
//也即只能用来声明,而不能创建(不能使用的时候都不知道是什么类型)
public class Tongpeifu {

	public static void main(String[] args) {
		//声明
		List<?> list =new ArrayList<Integer>();
		list=new ArrayList<String>();
		list=new ArrayList<Object>();
		test(list);
		//编译错误不能用在创建对象
//		list =new ArrayList<?>();
	}
	public static void test(List<?> list){}
	class Test<T>{}
	//编译错误不能用在创建泛型类
	//class Test2<?>{}
	//编译错误不能用在创建泛型方法
	//public static <?> void name() {}
}

泛型的上限

package fanxing;
import java.util.ArrayList;
import java.util.List;
/*
 * extends:泛型的上限
 * 1.一般用于限制操作
 * 2.不能使用在添加数据上面,一般是读取操作
 * 
 * */
public class TestExtends {

	public static void main(String[] args) {
		// extends为上限
		Test<Fruit> t1=new Test<Fruit>();
		Test<Apple> t2=new Test<Apple>();
		
		List<? extends Fruit> list=new ArrayList<Fruit>();
		test(list);
		List<Fruit> list2=new ArrayList<Fruit>();
		test(list2);
		List<Apple> list3=new ArrayList<Apple>();
		test(list3);
	}
	//? extends Fruit
	public static void test(List<? extends Fruit> list) {
//不能用于添加数据
//		list.add(new Apple());
//		list.add(new FushiApple());
//		list.add(new Pear());
		list.add(null);
	}
	
	//泛型类
	static class Test<T extends Fruit>{}

}


泛型的下限

package fanxing;
import java.util.ArrayList;
import java.util.List;
public class TestSuper {
/*
 * 118 泛型的下限
 * */
	public static void main(String[] args) {
		List<Apple> list1=new ArrayList<Apple>();
		test(list1);
		List<Fruit> list2=new ArrayList<Fruit>();
		test(list2);
		List<Object> list3=new ArrayList<Object>();
		test(list3);
		
		//规则
		List<? super Apple> list4=new ArrayList<Apple>();
		test(list4);
		List<? super Apple> list5=new ArrayList<Object>();
		test(list5);
		List<? super FushiApple> list6=new ArrayList<Object>();
		//test(list6);
	}
	public static void test(List<? super Apple> list){
		//能用于添加数据,不能添加父对象
		list.add(new Apple());
		list.add(new FushiApple());
		//list.add(new Fruit());
		
		
	}

}

泛型没有多态,数组

package fanxing;
import java.util.ArrayList;
import java.util.List;
//泛型没有多态,数组
public class Meiduotai {

	public static void main(String[] args) {
		Fruit f1=new Apple();
		Fruit[] f2=new Fruit[5];
		//List<Fruit> list=new ArrayList<Apple>();
		List<? extends Fruit> list=new ArrayList<Apple>();
		
	}
}

猜你喜欢

转载自blog.csdn.net/qq_40802113/article/details/88049669