java泛型(2) 泛型在一般类中的使用

  1. 泛型的使用范围远远不止集合,它可以应用到一般的类中,在下面的例子中
    Apple<String> apple = new Apple<>("apple");
    Apple<Double> apple1 = new Apple<>(5.67);这两句都会生成Apple的逻辑子类,之所以叫逻辑子类,是因为他们在物理上并不存在, Apple<T>形参T根据传入的实际类型进行变化匹配,以下为代码实例 
    //泛型的使用范围远远不止集合,在一般的类中也可以使用泛型
    
    
    
    package UseIt;
    
    
    public class Apple<T> {
    
        private T info;
    
        public Apple(){}
    
        public Apple(T info){
            this.info = info;
        }
    
        public void setInfo(T info){
            this.info = info;
        }
    
        public T getInfo(){
            return this.info;
        }
    
    
    
    
        public static void main(String args[]){
            Apple<String> apple = new Apple<>("apple");
            System.out.println(apple.getInfo());
    
            Apple<Double> apple1 = new Apple<>(5.67);
            System.out.println(apple1.getInfo());
    
        }
    }
    //输出内容:
    //        apple
    //        5.67
  2. 当从泛型类派生子类的时候,要用具体的数据类型代替泛型,也就是说public class A1 extends Apple<T>{}这用的代码是错的,因为它没有用具体的数据类型代替泛型,一下为泛型类派生子类的代码实例(这里的Apple就是上面的Apple)

    package UseIt;
    
    public class A1 extends Apple<String> {
    
        public String getInfo(){
            return  "子类中的方法:" + super.getInfo();
        }
    
    //    public Object getInfo(){
    //        return "子类";
    //    }
    
        public static void main(String args[]){
            A1 a1 = new A1();
            a1.setInfo("java1");
            System.out.println( a1.getInfo());
        }
    
    }
    //输出结果
    //        子类中的方法java1
  3. 并不存在泛型类,或者说这些泛型类在内存中都是使用同一块内存,系统并不会为这些泛型类当做新类来处理,这些泛型类仅仅只是“看起来”是子类而已,所以,泛型变量是不可为成员变量或者在静态方法中的,以下为代码示例

    package UseIt;
    
    public class R<T> {
    
    //    static T info;
    //    这一句会报错,因为泛型是不可以作为成员变量的
    
        T age;
        public void foo(T age){}
    
    //    public static void bar(T msg){}
    //    这个方法也会报错,因为泛型是不可以再静态方法中的
    
    
        public static void main(String args[]){
    
            R<String> r = new R<>();
            R<Double> r1 = new R<>();
    
            boolean isEquals =  r.getClass() == r1.getClass();
    //      这里的isEquals是True,说明了系统并没有把它们当成新类来处理
        }
    
    }
    

猜你喜欢

转载自blog.csdn.net/weixin_39452731/article/details/81414266