public class xt {

public static void main(String in[]){
Animal an=new Animal();
Cat ca=new Cat();
String s=new String("listene to me");


Cage cg=new Cage();

cg.set(s);
show(cg);

}

static void show(Cage<Animal> cg){

System.out.println(cg.get());
}
}

class Animal{

public String toString(){
return "I am Animal";
}
}

class Cat extends Animal{

public String toString(){
return "I am Cat";
}
}

class Cage<T>{
private T to;

void set(T to){
this.to=to;
}

T get(){
return to;
}
}
问题就是:
这段代码为何能正常执行?
show()方法的定义中已经指定了参数必须是Cage<Animal>类型,
为什么使用一个未指定泛型的Cage对象cg作为参数,
居然不报错,还可以正常执行,奇怪!

解决方案 »

  1.   

    不会 报错  只是有警告 而已 你 放到 ide中看看就知道了这没有什么的
      

  2.   

    这时候你的<T>相当于就是<Animal> 
      

  3.   

    泛型是一种约束。约束程序员的操作。。而不是JVM
      

  4.   

    楼上说的对的, 去IDE里 会检查这个泛型 如果不对 会报错
      

  5.   

    泛型一般在java中除了集合中的实用类,其他时候最好不要用,应为java中的泛型没有其他语言的好用,这不是java的长处
      

  6.   


    其实也还好了,比没有看着好些.
    不过运行起来都一样.
    有的时候还真想全都搞成Object算了.
      

  7.   

    你的代码必须能运行!
    好像你对泛型理解错了,给show()参数传Cage的对象当然是可以的,因为show()方法的参数就是Cage的对象。这和它泛型没有多大关系,只会像现在这种情况给个没有定义泛型的警告。当然你这程序没有完全达到你自定义泛型的目的。可能你要接下来这样做来实现定义泛型的目的。
    如:
    class xt {
        
        public static void main(String in[]){
            Animal an=new Animal();
            Cat ca=new Cat();
            String s=new String("listene to me");
            
            
            Cage<Animal> cg=new Cage<Animal>();
            
            cg.set(ca);
            show(cg);
            
        }    
            
        static void show(Cage<Animal> cg){
            
            System.out.println(cg.get());
        }    
    }        
            
    class Animal{
            
        public String toString(){
            return "I am Animal";
        }    
    }        
            
    class Cat extends Animal{
            
        public String toString(){
            return "I am Cat";
        }    
    }        
            
    class Cage<T>{
        private T to;
            
        void set(T to){
            this.to=to;
        }    
            
        T get(){
            return to;
        }    
    }