Day22
泛型
-
泛型不同的引用不能相互赋值。
-
泛型结构式一个接口或抽象类,则不可创建泛型类的对象
-
泛型要使用的话就一路都要用,不用的话,就一路都别用,别上面用了,下面写的时候没用。
-
异常类不能是泛型的。
-
静态方法中不能使用类的泛型。
愿意:实例化的时候才定义泛型,静态方法随着类的加载而加载,此时还没有指明泛型类型,所以不行。
子类继承父类的泛型的情况
简单一点的。
class Father<T1,T2>{
}
//子类不保留父类的泛型
//1.没有类型 擦除
//等价于class Son extends Father<Object,Object>
class Son1 extends Father{}
//2.具体类型。
class Son2 extends Father<Integer,String>{}
//子类保留父类的泛型
//1.全部保留
class Son3<T1,T2>extends Father<T1,T2>{}
//部分保留
class Son4<T2> extends Father<Integer,T2>{}
复杂一点的。
class Father<T1,T2>{
}
//子类不保留父类的泛型
//1.没有类型 擦除
//等价于class Son extends Father<Object,Object>
class Son1<A,B> extends Father{}
//2.具体类型。
class Son2<A,B> extends Father<Integer,String>{}
//子类保留父类的泛型
//1.全部保留
class Son3<T1,T2,A,B>extends Father<T1,T2>{}
//部分保留
class Son4<T2,A,B> extends Father<Integer,T2>{}
泛型方法和泛型类不一样。泛型方法可以加static,因为只有在调用方法的时候才确定泛型。
//泛型方法,在方法中出现了泛型的结构,泛型参数与类的泛型参数没有任何关系
//换句话说,泛型方法所属的类是不是泛型类都没有关系。
//泛型方法;可以声明为静态的。原因:泛型参数是在调用方法时确定的,并非在实例化类时确定。
public <E> List<E> copyFromArrayToList(E[] arr){
ArrayList<E> list =new ArrayList<>();
for(E e:arr){
list.add(e);
}
return list;
}
}
泛型在继承方面的体现
类A是类B的父类,G<A>和G<B>二者不具备父类关系,二者是并列关系。
类A是类B的父类,A<G> 是B<G>的父类。
类A是类B的父类,G<A>和G<B>是没有关系的,二者共同的父类是:G<?>
通配符的使用
通配符:?, 👆这里使用了通配符的情况
读取看上界,写入看下界,没下界就只能写null
泛型的一些小练习
package com.sorrymaker.Generics;
import java.util.*;
public class DAO1<T> {
private Map<String, T> map = new HashMap<>();
//保存T类型的对象到Map成员变量中。
public void save(String id, T entity) {
map.put(id, entity);
}
//从map中获取id对应的对象。
public T get(String id) {
return map.get(id);
}
//替换map中key为id的内容,改为entity对象。
public void update(String id, T entity) {
if (map.containsKey(id)) {
map.put(id, entity);
}
}
//返回map中存放的所有T对象
public List<T> list() {
//values是无序的,不可重复的。
ArrayList<T> list = new ArrayList<>();
Collection<T> values = map.values();
for (T t : values) {
list.add(t);
}
return list;
}
//删除指定id对象
public void delete(String id){
map.remove(id);
}
}
IO流
I:input,输入
O:output,输出
File类的使用
File类的常用方法
package com.sorrymaker.IO;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.util.Date;
/**
* 流都是放在java.io包里的。
* File类的使用,
*
* 以下方法,都是在内存里面操作,并未使用到流。
*
* 1. File类的一个对象,代表一个文件或一个文件目录(文件夹)
* 2. File类声明在java.io包下。
* 3. File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法。
* 并未涉及到写入或读取文件内容的操作,如果需要读取或写入文件内容,必须使用IO流来完成
* 4. 后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的 "终点" 。
*/
public class FileTest {
/**
* 1。创建File类,实例化
* File(String filePath)
*
* File(String parentPath,String childPath)
*
* File(File parentFile,String childPath)
*
* 2. 相对路径:相较于某个路径下,指明的路径。
* 绝对路径:包含盘符在内的文件或文件目录的路径。
*
* 3.路径分隔符:window:\\
* unix:/
*/