泛型笔记

为什么使用泛型

  1. 泛型实质上就是使程序员定义安全的类型,在没有出现泛型之前,Java也提供了对Object的引用“任意化”操作,这种操作就是对Object引用进行向上转型或者向下转型的操作,但某些强制类型转换的错误不会被编译器捕捉,而在运行后出现了异常,可见强制类型转化存在安全隐患,所以提供了泛型机制。
public class OverClass<T> {        //定义泛型类
    private T over;                //定义泛型成员变量
    public T getOver(){            //设置getOver方法
        return over;
    }
    public void setOver(T over){    //设置setOver方法
        this.over=over;
    }

    public static void main(String[] args) {
        //实例化一个Boolean对象
        OverClass<Boolean> over1 = new OverClass<Boolean>();
        //实例化一个Float型对象
        OverClass<Float> over2 = new OverClass<Float>();
        over1.setOver(true);   //不需要进行类型转换
        over2.setOver(12.3f);
        Boolean b = over1.getOver();  //不需要进行类型转换
        Float f = over2.getOver();
        System.out.println(b);
        System.out.println(f);
        // TODO Auto-generated method stub

    }

}
  1. 菱形运算符
GenericMemoryCell<Integer> m = new GenericMemoryCell<Integer>();  //这里就很麻烦
GenericMemoryCell<Integer> m = new GenericMemoryCell<>();   //这样就简化了代码,这就是菱形运算符
  1. 带有限制的通配符
    主要作用是在创建一个泛型类对象时限制这个泛型类的类型实现或者继承某个接口或类的子类,可以使用extends 或者 super 来对泛型加以限制。
A<?extends List> a = null;
a = new A<ArrayList>();
a = new A<LinkedList>(); 
 //如果实例化没有实现List接口的泛型对象,编译器就会报错。例如实例化HashMap对象是=时,编译器就会报错
//如果使用A<?> 这种形式实例化对象,则默认表示可以将A指定实例化Object及以下的子类类型
List<String> l1 = new List<String>();
        l1.add("成员");
        List<?> l2 = new LinkedList<Integer>();
        l2.set(0, "成员改变");  //使用通配符声明的名称实例化的对象不能对其加入新的信息,set()方法不能被调用,只能获取或者删除
  1. 类型擦除
    泛型在很大程度上时Java语言的成分而不是虚拟机中的结构。泛型类可以由编译器通过所谓的泛型擦除过程转变成非泛型类。这样编译器就生成了一种与泛型类同名的原始类。

  2. 对于泛型的限制
    基本类型
    基本类型不能作为参数类型。我们必须使用它们的包装类
    instanceof检测
    instanceof检测和类型转换只是对原始类做的
    static语境
    在一个泛型类中,static和static域都不可以引用类的类型变量,因为在类型擦除后就不存在了
    泛型类型的实例化
    不能创建一个泛型类型的实例

 T obj = new T();   //右边是非法的

泛型数组对象
不能创建一个泛型数组

T[ ] arr = new T[10];  //右边是非法的

参数化类型数组
参数化类型数组是非法的

### 尚硅谷 Java 学习资料与笔记 #### 关于Java的基础概念 Java提供了一种机制,使得可以编写适用于多种类型的代码而无需针对每一种类型都单独重写相同的逻辑。这不仅提高了代码的可维护性和安全性,还增强了程序的功能灵活性[^4]。 #### 使用通配符增强功能 当处理未知的具体参数化类型时,可以通过使用`?`作为通配符来表示不确定的类型。对于只读操作而言非常有用;然而需要注意的是,如果尝试向此类列表中添加任何非`null`的对象,则会导致编译错误[^3]。 ```java public static void read(List<?> list) { for (Object o : list) { System.out.println(o); } } ``` 这段代码展示了如何遍历一个包含任意类型元素的集合并打印它们的内容。由于我们不知道实际存储着什么类型的对象,所以只能将其视为`Object`来进行访问。 #### 定义带有一个或多个类型形参的类 创建自定义类能够使开发者更方便地管理不同种类的数据结构。下面的例子说明了怎样声明带有单个类型变量`T`的一般形式以及相应的构造函数: ```java // 自定义类 public class Order<T> { private T temp; public Order(T temp) { this.temp = temp; } // getter 和 setter 方法... } ``` 此外还有支持多维数组转换成列表的方法实现方式如下所示: ```java // 自定义方法 public static <E> List<E> MyArrayToList(E[] arr) { ArrayList<E> list = new ArrayList<>(); for (E element : arr) { list.add(element); } return list; } ``` 上述例子中的静态方法接受一个由某种特定类型组成的数组,并返回相同类型的动态大小列表。这里的关键在于利用尖括号内的字母(如这里的`<E>`),它告诉编译器该方法本身也具有特性[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值