码迷,mamicode.com
首页 > 编程语言 > 详细

Java泛型知识总结篇

时间:2019-12-28 13:14:09      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:xtend   getc   win   out   row   exce   泛型类   com   each   

泛型与内部类

  • 非静态内部类会自动继承外围类泛型参数,对于非静态内部类,无需再次声明泛型参数
  • 静态内部类不会自动继承外围类泛型参数(事实上,Node中的泛型参数与MyLinkedList中的没有任何联系,只是这里使用相同的符号T而已)
  • 泛型类声明的泛型参数占主导地位,如泛型类声明的参数为,则泛型接口的泛型参数也应为
  • 当泛型类声明的参数为时,泛型接口的参数可以不写;
/**
 * 泛型类声明的泛型参数占主导地位,如泛型类声明的参数为<T>,则泛型接口的泛型参数也应为<T>;
 * 当泛型类声明的参数为<T>时,泛型接口的参数<T>可以不写;
 * @param <T>
 */
public class LinkedList<T> implements Iterable {

    @Override
    public Iterator iterator() {
        return null;
    }

    @Override
    public void forEach(Consumer action) {

    }

    @Override
    public Spliterator spliterator() {
        return null;
    }
}

泛型方法

public class GenericMethods{
    public <T> void f(T x) {
        System.out.println(x.getClass().getName());
    }
}

泛型擦除

  • 在泛型代码内部,无法获得任何与关泛型参数类型的信息
    List 和 List 在运行时事实上是相同的类型,都是List

  • 泛型类型参数将擦除到它的第一个边界

  • 之所以使用擦除来实现泛型,是为了迁移兼容性

泛型边界

  • extends对泛型上限进行了限制即T必须是Comparable<? super T>的子类,然后<? super T>表示Comparable<>中的类型下限为T!

创建泛型类型的对象或者数据

  • new T()在java中无法实现,可以通过传递一个工厂对象,来创建新的实例,或者自己显示工厂
class ClassAsFactory<T>{
       T x;
       public ClassAsFactory(Class<T> kind){
            try {
                x = kind.newInstance();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
}
  • 泛型数组创建,也不都能用Object[]强转,因为类型擦除到第一个边界,边界不一定是object
public class ZwbHeap<T extends Comparable<? super T>> {
    private T[] nodes;
    private int size;
    private int capacity = 16;

    public ZwbHeap() {
        // 这样转换会失败
        //nodes = (T[])new Object[capacity+1];
        // 必须这样写
        nodes = (T[])new Comparable[capacity+1];
    }
}

Java泛型知识总结篇

标签:xtend   getc   win   out   row   exce   泛型类   com   each   

原文地址:https://www.cnblogs.com/textworld/p/12111204.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!