java基础学习日志15

泛型

public class Animal {
	String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Animal(String name) {
		this.name = name;
	}

	public Animal() {

	}
}

class Dog extends Animal {

	public Dog(String name) {
		super(name);
		this.name = name;
	}

	public Dog() {
	}
}

class Courser extends Dog {
	public Courser(String name) {
		super(name);
		this.name = name;
	}

}



/**
 * 通过泛型的继承,可以对箱子中放置的对象进行限制,只能是extends后的类型以及其子类类型
 * 
 * @author 孙勇
 * @date 2018年1月31日上午9:52:53
 * @param 
 */
public class Box1 {
	T t;

	public T getT() {
		return t;
	}

	public void setT(T t) {
		this.t = t;
	}

	public static void main(String[] args) {
		// Box1 dogBox=new Box1();
		// 不支持协变,类型由子类类型想父类类型进制转换的时候这种是协变,java的泛型是不支持的
		// Box1 animalBox=dogBox;
		// Box1 animalBox2=new Box1();
		// 不支持逆变 类型由父类类型向子类类型进制转换的时候这种是逆变,java的泛型是不支持的
		// Box1 courserBox=new Box1();
		// Animal[] animals=new Dog[3];
		// animals[0]=new Animal();
		// Dog[] dogarr = (Dog[]) new Animal[3];
		// dogarr[0]=new Dog();

//		Box1 dogBox = new Box1();
//		dogBox.setT(new Dog("狗狗"));
//		Dog dog = dogBox.getT();
//		Box1 animalBox = new Box1();
//		animalBox.setT(new Animal("lisi"));
//		
//		System.out.println("dogBox.getClass==animalBox.getClass()=" + (dogBox.getClass() == animalBox.getClass())); // true
//		System.out.println("dogBox.getClass==Box.class=" + (dogBox.getClass() == Box1.class)); // true
//
//		if (dogBox instanceof Box1) {
//			System.out.println("dogBox就是Box"); // 输出:dogBox就是Box
//		}

		Box1 dogBox=new Box1();
		//java泛型只存在于编译期,运行期没有类型信息,类型参数被擦除为Object类型
		//两个引用指向同一个箱子
//		Box1 box=dogBox;
//		//成功的在运行期讲一个动物对象放入了狗箱子
//		box.setT(new Animal("hello"));
//		//成功的在运行期将字符串对象放入了狗箱子
//		box.setT("hello world");
//		System.out.println(box.getT());
//		
//		Box1 animalBox=new Box1();
//		Box1 courserB=new Box1();
//		courserB.setT(new Courser("hh")); //赋值为猎狗的箱子也可以,因为course继承Dog
//		animalBox=courserB;
////		animalBox.setT(new Dog("aa"));
////		animalBox.setT(new Courser("hh"));
//		Courser c = (Courser) animalBox.getT();
//		System.out.println(c.name);
		
		//使用带super的通配符后,类似逆变
		Box1 courserBox=new Box1();
		courserBox=new Box1();
		//可以放入
		courserBox.setT(new Courser("hh"));
		//但是取出的类型推断的是Object,又需要强制类型转换了,丢失类类型信息
		Courser object=(Courser)courserBox.getT();
		System.out.println(object.name);

	}

}


public interface GenericInterface {
	T generatObj();
}
public class Flower {

}


public class Box {
	T t;
	K k;
	public T getT() {
		return t;
	}
	public void setT(T t) {
		this.t = t;
	}
	public K getK() {
		return k;
	}
	public void setK(K k) {
		this.k = k;
	}
	
	
}


public class Test {
	public static void main(String[] args) {
//		Box b1 = new Box();
//		Animal ani = new Animal();
//		Flower f = new Flower();
//		b1.setK(f);
//		b1.setT(ani);
//		Animal ain1 = b1.getT();
		
//		通过泛型可以对箱子内放置的对象进行限定,放置的对象只能是标签类型以及子类类型
//		Box1 ba1 = new Box1();
//		Box1 ba2 = new Box1();
//		Box1 ba3 = new Box1();
//		Box1 ba4 = new Box1();
//		
		Animal ani = new Animal();
		Dog d = new Dog();
		Courser c = new Courser();
//		ba1.setT(ani);
//		ba2.setT(d);
//		ba3.setT(c);
//		String str = new String("tom");
//		Courser ani1 = (Courser) ba1.getT();
//		Dog d1 = (Dog) ba2.getT();
//		Courser c1 = (Courser) ba3.getT();
		
		Box1 dogBox=new Box1();
		Box1 animalBox=new Box1();
		dogBox.setT(c);
		animalBox.setT(d);
		Courser c1 = (Courser) dogBox.getT();
		
	}
}


你可能感兴趣的:(java基础学习日志15)