zoukankan      html  css  js  c++  java
  • 《疯狂Java讲义》(二十七)----泛型

    • 菱形语法

    List<String> strList = new ArrayList<String>();

    Java7 后允许在构造器后不需要带完整的泛型信息,只要给出一对尖括号即可。

    List<String> strList = new ArrayList<>();

    • 泛型接口/类

    可以为任何类/接口增加泛型声明

    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 class GenericClassDemo {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            Apple<String> a1 = new Apple<>("Apple");
            System.out.println(a1.getInfo());
            Apple<Double> a2 = new Apple<>(5.97);
            System.out.println(a2.getInfo());
        }
    
    }

    当创建带泛型声明的自定义类,为该类定义构造器时,构造器名还是原来的类名,不要增加泛型声明。例如,Apple<T>,构造器名依然是Apple,不是Apple<T>.

    • 从泛型类派生子类

    当创建了带泛型声明的接口/父类之后,可以为该接口创建实现类,或从该父类派生子类,但需要指出的是,当使用这些接口/父类时不能在包含类型形参。

    class Apple<T> {
        protected 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;
        }
    }
    
    class A1 extends Apple<String> {
        public A1(String info) {
            this.info = info;
        }
    }
    public class GenericClassDemo {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            Apple<String> a1 = new Apple<>("Apple");
            System.out.println(a1.getInfo());
            Apple<Double> a2 = new Apple<>(5.97);
            System.out.println(a2.getInfo());
            
            A1 aa1 = new A1("Apple");
            System.out.println(aa1.getInfo());
        }
    
    }

    不管为泛型的类型参数传入哪一种类型实参,对于Java来说,它们依然被当成同一个类处理。因此在静态方法/静态初始化块或者静态变量的声明和初始化中不允许使用类型形参。

    •  类型通配符

    List<?>表示未知类型元素的List,可以匹配任何类型。当这种带通配符的List仅表示它是各种泛型List的父类,并不能把元素加入到其中。

    • 设定类型通配符的上限

    List<? extends SomeClass>, ?表示未知类型,但一定是SomeClass的子类型或本身,因此SomeClass称为这个通配符的上限。

    • 泛型方法
    import java.util.ArrayList;
    import java.util.Collection;
    
    public class GenericMethodDemo {
    
        static <T> void fromArrayToCollection(T[] a, Collection<T> c) {
            for (T o : a) {
                c.add(o);
            }
        }
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            String[] sa = new String[100];
            Collection<String> sc = new ArrayList<>();
            fromArrayToCollection(sa, sc);
        }
    
    }
    • 设定通配符下限

    <? super Type> 表示它必须是Type本身,或是Type的父类。

  • 相关阅读:
    性能测试分类
    monkey命令选项参考
    Hibernate三种状态
    Hibernate 的延迟加载
    JAVA2的三个版本
    缓存
    队列、生产消费模型.html
    socketserver剖析.html
    socketserver 之 recv(1024) 问题!
    粘包问题
  • 原文地址:https://www.cnblogs.com/IvySue/p/6383281.html
Copyright © 2011-2022 走看看