泛型实现接口的理解
非同一实现类中,子类实现父类的泛型
先举一段代码
//这里接口X的泛型类型为T,特定某一类对象
interface X<T> {
}
//实现父类X
class XX<T> implements X<T>{
}
实现类XX实现了X父类,那么就必须指定泛型,
1、这里XX<T>表示的意思是任何new XX<?>()语法中?需要指定具体的T类型,同时XX和X都是泛型的同一类型,这里依赖的是实现类的特定类型。
2、也可以擦除泛型,那么就直接new XX();不需要钻石操作符。
同一实现类中,子类实现父类的泛型
先举一段代码
class A<T>{
在classA中的接口X和其实现类XX
interface X<T> {
}
//这里XX<T>将会泛型覆盖父类的类型
class XX<T> implements X<T>{
}
}
为什么这里会出现这么个类型覆盖呢?
原因是这样的:
X和XX均是在类型A的内部类,而A本身也是指定了泛型T,你实现类也写了个XX<T>,那这样我编译器就默认了你XX<T>和外部类的A<T>可能不是同一个类型,这里就出现了hide,隐藏
如果XX<T>替换为其他的字符,如果XX<K>那么就不会出现泛型覆盖了。但是你想说,我就是想用外部类的T类型,怎么用呢,那你可以尝试这样使用XX不带钻石操作符,擦除泛型。
class A<T>{
interface X<T> {
}
class XX implements X<T>{
}
}
如果觉得还是不理解,那么请看java源码ArrayList<E>中给出的范例,这里就是防止覆盖 :
衍生方法的泛型
在TreeMap源码中
调用了 TreeMap.this.successor(e)方法获取后继结点,(这个后继结点的源码分析,需要了解排序二叉树的知识点)
我们看这个方法
这里其实本身也是泛型了方法的。
泛型的更多知识点,还需要不断的遇见,不断地学习。