纠错与更改所有文章的图床

This commit is contained in:
Dragon
2021-03-22 20:01:15 +08:00
parent cdb811a48a
commit bf0d1bcccd
27 changed files with 767 additions and 642 deletions

View File

@@ -9,9 +9,8 @@ categories:
- 重难点
keywords: Java基础泛型
description: 万字长文详解Java泛型。
cover: 'https://cdn.jsdelivr.net/gh/youthlql/lql_img/Java_Basis/logo.png'
top_img: 'https://cdn.jsdelivr.net/gh/youthlql/lql_img/blog/top_img.jpg'
abbrlink: 1c342bc4
cover: 'https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/Java_Basis/logo.png'
abbrlink: adb2faf0
date: 2020-10-19 22:21:58
---
@@ -592,7 +591,8 @@ class GenerateTest<T> {
/**
* 1、在泛型类中声明了一个泛型方法使用泛型E这种泛型E可以为任意类型。可以类型与T相同也可以不同。
* 2、由于泛型方法在声明的时候会声明泛型<E>,因此即使在泛型类中并未声明泛型,编译器也能够正确识别泛型方法中识别的泛型。
* 2、由于泛型方法在声明的时候会声明泛型<E>,因此即使在泛型类中并未声明泛型,编译器也能够正确识别
泛型方法中识别的泛型。
*/
public <E> void show_3(E t) {
System.out.println(t.toString());
@@ -777,7 +777,8 @@ class Order<T> {
/**
* 2、泛型方法在方法中出现了泛型的结构泛型参数与类的泛型参数没有任何关系。换句话说
* 泛型方法所属的类是不是泛型类都没有关系。
* 3、泛型方法可以声明为静态的。原因泛型参数是在调用方法时确定的。并非在初始化类时确定,所以无所谓
* 3、泛型方法可以声明为静态的。原因泛型参数是在调用方法时确定的。并非在初始化类时确定,
* 所以无所谓
*/
public static <E> List<E> copyFromArrayToList(E[] arr){
@@ -1037,7 +1038,7 @@ class Dog extends Animal {
`test1()`在编译时就会飘红
<img src="https://cdn.jsdelivr.net/gh/youthlql/lql_img/Java_Basis/Generic/0001.png">
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/Java_Basis/Generic/0001.png">
@@ -1289,7 +1290,7 @@ public class Test_difference {
}
```
<img src="https://cdn.jsdelivr.net/gh/youthlql/lql_img/Java_Basis/Generic/0002.png">
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/Java_Basis/Generic/0002.png">
### 区别3通配符可以使用超类限定而T不行
@@ -1382,7 +1383,7 @@ class D<T> {
Java中的泛型基本上都是在编译器这个层次来实现的在生成的Java字节码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数编译器在编译的时候去掉这个过程就称为类型擦除。
如在代码中定义的List<object>List<String>等类型在编译后都会编程ListJVM看到的只是List。而由泛型附加的类型信息对JVM来说是不可见的。Java编译器会在编译时尽可能的发现可能出错的地方但是仍然无法避免在运行时刻出现类型转换异常的情况。类型擦除也是Java的泛型实现方法与C++模版机制实现方式之间的重要区别。
如在代码中定义的`List<object>``List<String>`等类型在编译后都会编程ListJVM看到的只是List。而由泛型附加的类型信息对JVM来说是不可见的。Java编译器会在编译时尽可能的发现可能出错的地方但是仍然无法避免在运行时刻出现类型转换异常的情况。类型擦除也是Java的泛型实现方法与C++模版机制实现方式之间的重要区别。
可以通过两个例子来证明java泛型的类型擦除。