泛型
- 泛型的意义:
- 1、自动进行类型的检查
- 2、自动进行类型的转换
- 泛型的一些重点:
- 1、泛型是怎么编译的? 擦除机制 -》 Object
- 2、泛型的类型 不参与类型的组成
- 3、泛型的参数 不能是简单类
找最大值
class GenericAlg <T extends Comparable> {
// 泛型类的形参可以是多个T1,T2,T3.。。
public T maxValue(T[] array) {
T max = array[0];
for (int i = 1; i < array.length; i++) {
if(array[i].compareTo(max) > 0) {
max = array[i];
}
}
return max;
}
} 需要new 一个GenericAlg类的对象才能调用maxValue
变成静态方法则可以直接用类名调用静态方法
泛型方法:
方法限定符 返回值类型 方法名称(形参列表) { … }
class GenericAlg2 {
public static<T extends Comparable> T maxValue(T[] array) {
}
} System.out.println(GenericAlg2.maxValue(array));
泛型的上界 extends
-
T extends x
-
T 是实现了X这个接口(X的子类或者X自己本身)
泛型类的定义-类型边界
Public class MyArrayList {}
泛型类名称<类型形参 extends 类型边界>
类型擦除
class MyArrayList {
// E 会被擦除为 Object }
class MyArrayList< E extends Comparable> {
// E 被擦除为 Comprable }
泛型类的使用-通配符 ? (Wildcards)
通配符:源码当中.
- 泛型的区别:
- 1、通配符一般用于读取
- 2、通配符不仅有上界 还有下界
-
通配符-上界
<? extends 上界> -
通配符-下界
静态内部类
内部类:
* 1、实例内部类
- 2、静态内部类
- 3、匿名内部类
- 4、本地内部类
1、拿到实例内部类对象的方式
OuterClass outer = new OuterClass();
*OuterClass.InnerClass innerClass= outer.new InnerClass();
外部类名 . 静态内部类类名
* 2、不能再实例内部类当中 定义一个静态的变量.
非要定义呢?
在编译时期能够确定的值:public static final int data5 = 5;
* 3、面试问题:实例内部类是否有额外的开销? 有
OuterClass.this
拿到外部类的data1:System.out.println(OuterClass.this.data1);
* 4、this--> 静态的 原因:OuterClass.this
* 5、注意 内部类 产生的字节码文件 外部类名$内部类名.class
1、如何拿到静态内部类的实例对象?
OuterClass.InnerClass innerClass =
new OuterClass.InnerClass();
2、 静态内部类当中 是不可以访问外部类的非静态数据成员的 非要访问呢?
static class InnerClass {
OuterClass outerClass;
构造方法: public InnerClass(OuterClass out) {
this.outerClass = out;
}
public void test() {
System.out.println(outerClass.外部类的成员);
}
}
Main:OuterClass out = new OuterClass();
OuterClass.InnerClass innerClass =
new OuterClass.InnerClass(out);
innerClass.test();
//匿名内部类
public class Text{
public static void main(String[] args) {
//匿名内部类
new OuterClass(){
@Override
public void test() {
System.out.println(“hahahahhaha”);
}
}.test();
}
}
public void func() {
class A {
//本地内部类
}
}
泛型的限制
- 泛型类型参数不支持基本数据类型
- 无法实例化泛型类型的对象
- 无法使用泛型类型声明静态的属性
- 无法使用 instanceof 判断带类型参数的泛型类型
- 无法创建泛型类数组
- 无法 create、catch、throw 一个泛型类异常(异常不支持泛型)
- 泛型类型不是形参一部分,无法重载