泛型

泛型

  • 泛型的意义:
  • 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、通配符不仅有上界 还有下界
  1. 通配符-上界
    <? extends 上界>

  2. 通配符-下界

<? super 下界> // 可以传入类型实参是 Integer 父类的任意类型的 MyArrayList public static void printAll(MyArrayList<? super Integer> list) { ... } // 以下调用都是正确的 printAll(new MyArrayList()); printAll(new MyArrayList()); printAll(new MyArrayList 泛型中的父子类型(重要) MyArrayList 不是MyArrayList的父类型 // 需要使用通配符来确定父子类型 // MyArrayList<?> 是 MyArrayList<? extends Number> 的父类型

静态内部类
内部类:
* 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 {
//本地内部类
}
}

泛型的限制

  1. 泛型类型参数不支持基本数据类型
  2. 无法实例化泛型类型的对象
  3. 无法使用泛型类型声明静态的属性
  4. 无法使用 instanceof 判断带类型参数的泛型类型
  5. 无法创建泛型类数组
  6. 无法 create、catch、throw 一个泛型类异常(异常不支持泛型)
  7. 泛型类型不是形参一部分,无法重载
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值