美文网首页
Java泛型

Java泛型

作者: sngths | 来源:发表于2017-03-30 11:37 被阅读16次

    泛型类

    public class Container<K, V> {
        private K key;
        private V value;
    
        public Container(K k, V v) {
            key = k;
            value = v;
        }
    
        public K getKey() {
            return key;
        }
    
        public void setKey(K key) {
            this.key = key;
        }
    
        public V getValue() {
            return value;
        }
    
        public void setValue(V value) {
            this.value = value;
        }
    }
    

    在编译期,是无法知道K和V具体是什么类型,只有在运行时才会真正根据类型来构造和分配内存。

    泛型接口

    在泛型接口中,生成器是一个很好的理解,看如下的生成器接口定义:

    public interface Generator<T> {
        public T next();
    }
    

    然后定义一个生成器类来实现这个接口:

    public class FruitGenerator implements Generator<String> {
    
        private String[] fruits = new String[]{"Apple", "Banana", "Pear"};
    
        @Override
        public String next() {
            Random rand = new Random();
            return fruits[rand.nextInt(3)];
        }
    }
    

    泛型方法

    一个基本的原则是:无论何时,只要你能做到,你就应该尽量使用泛型方法。也就是说,如果使用泛型方法可以取代将整个类泛化,那么应该有限采用泛型方法。下面来看一个简单的泛型方法的定义

    public class Main {
    
        public static <T> void out(T t) {
            System.out.println(t);
        }
    
        public static void main(String[] args) {
            out("findingsea");
            out(123);
            out(11.11);
            out(true);
        }
    }
    

    可以看到方法的参数彻底泛化了,这个过程涉及到编译器的类型推导和自动打包,也就说原来需要我们自己对类型进行的判断和处理,现在编译器帮我们做了。这样在定义方法的时候不必考虑以后到底需要处理哪些类型的参数,大大增加了编程的灵活性。

    再看一个泛型方法和可变参数的例子:

    public class Main {
    
        public static <T> void out(T... args) {
            for (T t : args) {
                System.out.println(t);
            }
        }
    
        public static void main(String[] args) {
            out("findingsea", 123, 11.11, true);
        }
    }
    

    <T>是用来规范T的,例如<T extends Object>就规定了边界,即规定了所有出现T的地方,T类型必须是Object的子类

    泛型通配符

    • ? 通配符类型
    • <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类
    • <? super T> 表示类型下界(Java Core中叫超类型限定),表示参数化类型是此类型的超类型(父类型),直至Object

    extends 可用于的返回类型限定,不能用于参数类型限定。
    super 可用于参数类型限定,不能用于返回类型限定。
    带有super超类型限定的通配符可以向泛型对易用写入,带有extends子类型限定的通配符可以向泛型对象读取。

    相关文章

      网友评论

          本文标题:Java泛型

          本文链接:https://www.haomeiwen.com/subject/qlpuottx.html