class GenClassDemo3
{
public static String str;
public static Integer i;
public static void main(String[] args)
{
//(Object)str="hello"; //:7: 错误: 意外的类型
//(Object)i=10; //:7: 错误: 意外的类型
// str=i;
// System.out.println(str);
//错误: 不兼容的类型: Integer无法转换为String
//不同类型的成员不能相互赋值。编译的时候就通不过。也不能强制类型转换(强制类型转换,发生在父与子类直接)。
SupGen<Dog> sg1=new SupGen<Dog>();
SupGen<Cat> sg2=new SupGen<Cat>();
//sg1=sg2就是错的……类型不一致。
SupGen<? extends Animal> sg3=new SupGen<Cat>();
SupGen<? extends Animal> sg4=null;
//((Cat)sg3.getVar1()).eat(); --> sg3的类型和Cat的类型肯定不同。Cat只是SupGen的一个泛型标识符。所以不能这样强制转化。
//sg3.getVar1().eat();---》这个语句没有错但是sg3对象,还没有setVar1的值。return的值是null。但是sg3.setVar1(new Cat())直接
//这个语句会报错:其中, CAP#1是新类型变量:
// CAP#1从? extends Animal的捕获扩展INT#1
// 其中, INT#1是交叉类型:
// INT#1扩展Animal,IAnimal
//用人话来说就是sg3的泛型类型是?。("?"其实是符合条件的某一个;"*"才是只所有).
//如果直接sg3.setVar1(T var1) 如果var1改为new Dog()或者new Cat();说明T是Cat或者Dog类型,但是sg3对象本身已经标明是?的对象了。
//所以会报错。 sg3=new SupClass<Dot>();可以直接接收一个任意的符合?规则的类。 也是多态的体现。
//但是如果用set方法的话,还是不行的。用get方法可以
sg1.setVar1(new Dog());
sg1.getVar1().eat();
sg2.setVar1(new Cat());
sg3=sg2;
sg4=sg1; //sg4是泛型标识为? extens Animal的对象。接收了符合规则的Dog类的对象,多态允许这样。
//(sg4.setVar1(new Dog())).eat(); //哪怕sg4引用变量已经指向了sg1实例。sg4的泛型标识符还是?extends Animal.
//不能直接new Dog()设定为新的Dog泛型标识符。?和Dog类型不兼容。 也侧面说明(强制类型转换只能强制的让编译通过,实际不改变
//他们指向的实例的属性。)
//但是sg4能够引用自己的无参的对象方法 getVar1()
sg4.getVar1().tell();//输出“啃骨头”。
sg3.getVar1().eat();
//SupGen<Dog extends Animal> sg1=new SupGen<Dog extends Animal>(); //前面的可以使用extends Object限定。后面new实例的时候必须是确定的
//类型。 毕竟前面的只是引用变量。后面的是实例。
//sg1=sg2;
//不兼容的类型: SupGen<Cat>无法转换为SupGen<Dog>
//同样也不能相互赋值。对象类型不同。对象类型相同一般考虑属性相同和方法相同。
//属性由于T1 T2标记不同而不同。 方法也是由于方法参数类型T1 T2不同,所以类型不同。
//T1 T2标记的这两个泛型类相当于两个不同的类。
/*
泛型通配符类型:
GenClass<? extends Animal> gc=new GenClass<Dog>; ?限制泛型的范围是Animal或者其子类。
<? extends A & B &C> 如果ABC类或接口中里面有一个是class必须放在最前面
*/
}
}
class SupGen<T extends Animal & IAnimal>
{
private T var1;
public void setVar1(T var1){
this.var1=var1;
}
public T getVar1(){
return var1;
}
}
interface IAnimal
{
public void tell();
}
abstract class Animal
{
private String name;
public abstract void eat();
}
class Dog extends Animal implements IAnimal
{
public void eat(){
System.out.println("啃骨头");
}
public void tell(){
System.out.println("接口:Dog正在吃鱼");
}
}
class Cat extends Animal implements IAnimal
{
public void eat(){
System.out.println("吃鱼");
}
public void tell(){
System.out.println("接口:cat正在吃鱼");
}
}
{
public static String str;
public static Integer i;
public static void main(String[] args)
{
//(Object)str="hello"; //:7: 错误: 意外的类型
//(Object)i=10; //:7: 错误: 意外的类型
// str=i;
// System.out.println(str);
//错误: 不兼容的类型: Integer无法转换为String
//不同类型的成员不能相互赋值。编译的时候就通不过。也不能强制类型转换(强制类型转换,发生在父与子类直接)。
SupGen<Dog> sg1=new SupGen<Dog>();
SupGen<Cat> sg2=new SupGen<Cat>();
//sg1=sg2就是错的……类型不一致。
SupGen<? extends Animal> sg3=new SupGen<Cat>();
SupGen<? extends Animal> sg4=null;
//((Cat)sg3.getVar1()).eat(); --> sg3的类型和Cat的类型肯定不同。Cat只是SupGen的一个泛型标识符。所以不能这样强制转化。
//sg3.getVar1().eat();---》这个语句没有错但是sg3对象,还没有setVar1的值。return的值是null。但是sg3.setVar1(new Cat())直接
//这个语句会报错:其中, CAP#1是新类型变量:
// CAP#1从? extends Animal的捕获扩展INT#1
// 其中, INT#1是交叉类型:
// INT#1扩展Animal,IAnimal
//用人话来说就是sg3的泛型类型是?。("?"其实是符合条件的某一个;"*"才是只所有).
//如果直接sg3.setVar1(T var1) 如果var1改为new Dog()或者new Cat();说明T是Cat或者Dog类型,但是sg3对象本身已经标明是?的对象了。
//所以会报错。 sg3=new SupClass<Dot>();可以直接接收一个任意的符合?规则的类。 也是多态的体现。
//但是如果用set方法的话,还是不行的。用get方法可以
sg1.setVar1(new Dog());
sg1.getVar1().eat();
sg2.setVar1(new Cat());
sg3=sg2;
sg4=sg1; //sg4是泛型标识为? extens Animal的对象。接收了符合规则的Dog类的对象,多态允许这样。
//(sg4.setVar1(new Dog())).eat(); //哪怕sg4引用变量已经指向了sg1实例。sg4的泛型标识符还是?extends Animal.
//不能直接new Dog()设定为新的Dog泛型标识符。?和Dog类型不兼容。 也侧面说明(强制类型转换只能强制的让编译通过,实际不改变
//他们指向的实例的属性。)
//但是sg4能够引用自己的无参的对象方法 getVar1()
sg4.getVar1().tell();//输出“啃骨头”。
sg3.getVar1().eat();
//SupGen<Dog extends Animal> sg1=new SupGen<Dog extends Animal>(); //前面的可以使用extends Object限定。后面new实例的时候必须是确定的
//类型。 毕竟前面的只是引用变量。后面的是实例。
//sg1=sg2;
//不兼容的类型: SupGen<Cat>无法转换为SupGen<Dog>
//同样也不能相互赋值。对象类型不同。对象类型相同一般考虑属性相同和方法相同。
//属性由于T1 T2标记不同而不同。 方法也是由于方法参数类型T1 T2不同,所以类型不同。
//T1 T2标记的这两个泛型类相当于两个不同的类。
/*
泛型通配符类型:
GenClass<? extends Animal> gc=new GenClass<Dog>; ?限制泛型的范围是Animal或者其子类。
<? extends A & B &C> 如果ABC类或接口中里面有一个是class必须放在最前面
*/
}
}
class SupGen<T extends Animal & IAnimal>
{
private T var1;
public void setVar1(T var1){
this.var1=var1;
}
public T getVar1(){
return var1;
}
}
interface IAnimal
{
public void tell();
}
abstract class Animal
{
private String name;
public abstract void eat();
}
class Dog extends Animal implements IAnimal
{
public void eat(){
System.out.println("啃骨头");
}
public void tell(){
System.out.println("接口:Dog正在吃鱼");
}
}
class Cat extends Animal implements IAnimal
{
public void eat(){
System.out.println("吃鱼");
}
public void tell(){
System.out.println("接口:cat正在吃鱼");
}
}