day15 泛型
泛型概述
可以在类或方法中预支地使用未知的类型。
注意
一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。
使用泛型的好处
-
将运行时期的ClassCastException,转移到了编译时期变成了编译失败。
-
避免了类型强转的麻烦
泛型的定义和使用
通常情况下,T,E,K,V,?是这样约定的:
-
?表示不确定的 java 类型
-
T (type) 表示具体的一个java类型
-
K V (key value) 分别代表java键值中的Key Value
-
E (element) 代表Element
泛型可以用到类、方法、接口,属性中
泛型中的类型 <类型> 只能是引用类型
泛型方法
定义格式
修饰符 <代表泛型的变量> 返回值类型 方法名 (参数){ }
泛型接口
-
定义格式
修饰符 interface接口名<代表泛型的变量> { }
类和接口对于和泛型的定义格式一样
泛型通配符
什么是泛型通配符
当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。
通配符基本使用
泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。
此时只能接受数据,不能往该集合中存储数据。
举例
Collection<?> c5 = new ArrayList<Object>();
Collection<?> c6 = new ArrayList<Animal>();
Collection<?> c7 = new ArrayList<Dog>();
Collection<?> c8 = new ArrayList<Cat>();
什么情况不能使用T要用?
Collection<?> a = new ArrayList<String>();
a = new ArrayList<Integer>();
下面的会报错
Collection<T> b = new ArrayList<>();
b = new ArrayList<Integer>();
通配符高级使用
?:任意类型,如果没有明确,那么就是Object以及任意的Java类了
?表示任意的类型都是可以的
Collection<?> c5 = new ArrayList<Object>();
Collection<?> c6 = new ArrayList<Animal>();
Collection<?> c7 = new ArrayList<Dog>();
Collection<?> c8 = new ArrayList<Cat>();
? extends E:向下限定,E及其子类
// ? extends E:向下限定,E及其子类,表示包括E在内的任何子类;
// Collection<? extends Animal> c9 = new ArrayList<Object>();
Collection<? extends Animal> c10 = new ArrayList<Animal>();
Collection<? extends Animal> c11 = new ArrayList<Dog>();
Collection<? extends Animal> c12 = new ArrayList<Cat>();
? super E:向上限定,E极其父类
? super E:向上限定,E极其父类,表示包括E在内的任何父类;
Collection<? super Animal> c13 = new ArrayList<Object>();
Collection<? super Animal> c14 = new ArrayList<Animal>();
// Collection<? super Animal> c15 = new ArrayList<Dog>();
// Collection<? super Animal> c16 = new ArrayList<Cat>();
静态导入
第一种
System.out.println(java.lang.Math.abs(-100));
第二种
import static java.lang.Math //lang包写一般不导入包,也可以导入包 System.out.println(Math.abs(-100));
第三种
import static java.lang.Math.abs; System.out.println(abs(-100));
可变参
可变参数(T...a) 不限类型,不限长度,可传入多个参数,也可传入数组
举例
public class VarargsExample {
public static void myMethod(char... args) {
for (char arg : args) {
System.out.println(arg);
}
}
public static void main(String[] args) {
char[] myArray = {'H', 'e', 'l', 'l', 'o'};
myMethod(myArray); // 传递一个字符数组作为参数
myMethod('H', 'e', 'l', 'l', 'o'); // 直接传递多个字符作为参数
}
}
数组和集合互转
list集合 --> set集合
List<String> list = new ArrayList<>();
list.add("a");
Set<String> set = new HashSet<>(list);
set集合 --> list集合
Set<String> sets = new HashSet<>();
sets.add("a");
List<String> lists = new ArrayList<>(sets);
注意事项
虽然可以把数组转成集合,但是集合的长度不能改变。
数组 --> list集合
String[] str = {"hello","world","java"};
方式一
List<String> list = Arrays.asList(str);
方式二
List<String> list = Arrays.stream(str).collect(Collectors.toList());//int,short,byte类型需要加上一个单独的方法,其他的暂时未知
list集合 --> 数组
List<String> list = new ArrayList<String>();
list.add("hello");
list.add("world");
String[] str = new String[list.size()];
list.toArray(str);//toArray参数中只能传入引用数组的数据类型
数组 --> set集合
String[] s = {"a","b","c"};
方式一
List<String> list = Arrays.asList(s);
Set<String> set = new HashSet<>(list);
方式二
Set<String> set = Arrays.stream(s).collect(Collectors.toSet());//int,short,byte类型需要加上一个单独的方法,其他的暂时未知
set集合-->数组
Set<String> set = new HashSet<>();
set.add("abc");
List<String> lists = new ArrayList<>(set);
String[] str4 = new String[lists.size()];
lists.toArray(str4);//toArray参数中只能传入引用数组的数据类型
注意 int 数组 转 set 和 list集合
第二种方法为
Set<Integer> set = Arrays.stream(n).boxed().collect(Collectors.toSet());
Collections
Collections是针对集合操作的工具类
Collections常用的方法
| 方法名 | 说明 |
|---|---|
| public static void sort(List<T> list) | 将指定的列表按升序排序 |
| public static void reverse(List<?> list) | 反转指定列表中元素的顺序 |
| public static void max() | 获取集合中最大值 |
collection和collectons的区别?
Collection 是一个集合接口
Collections 是一个操作集合的工具类
File类
是文件和目录路径名的抽象表示(其实file创建的对象,就是将要 将要创建的文件或者目录的路径 创建成一个对象,此时不会对盘符有任何影响),主要用于文件和目录的创建、查找和删除等操作。
File类构造方法
| 方法名 | 说明 |
|---|---|
| public File(String pathname) | 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 |
| public File(String parent, String child) | 从父路径名字符串和子路径名字符串创建新的 File实例。 |
| public File(File parent, String child) | 从父抽象路径名和子路径名字符串创建新的 File实例。 |
注意:
因为没有使用createNewFile()方法,所以创建的对象不会对电脑盘符中的目录或者文件有任何操作
如果使用了createNewFile()方法,将创建的对象盘符操作,操作后会返回boolean类型
获取功能方法
| 方法名 | 说明 |
|---|---|
| public String getAbsolutePath() | 返回此File的绝对路径名字符串。 |
| public String getPath() | 将此File转换为路径名字符串 |
| public String getName() | 返回由此File表示的文件或目录的名称。 |
| public long length() | 返回由此File表示的文件的长度。 |
判断功能的方法
| public boolean exists() | 此File表示的文件或目录是否实际存在。 |
|---|---|
| public boolean isFile() | 是否是一个文件 |
| public boolean isDirectory() | 此File表示的是否为目录。 |
| public boolean canWrite() | 是否能写 |
| public boolean canReade() | 是否能读 |
| public boolean isHidden() | 是否隐藏 |
创建&删除功能的方法
| 方法名 | 说明 |
|---|---|
| public boolean createNewFile() | 当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。 |
| public boolean delete() | 删除由此File表示的文件或目录。 |
| public boolean mkdir() | 创建由此File表示的目录。 |
| public boolean mkdirs() | 创建由此File表示的目录,包括任何必需但不存在的父目录。 |
注意
delete方法,如果此File表示目录,则目录必须为空才能删除。(如果要删除目录,目录中不能有文件,否则删不了)
在上述基础上,创建出来的多级目录,每次用file对象掉用一次delete,删除的只是最里面的一个文件,或者目录
重命名方法
public boolean renameTo(File dest)
如果路径名相同,就是改名。
如果路径名不同,就是改名并剪切。
举例
public static void main(String[] args) throws IOException {
//数据数据源,前提得这个数据存在
File srcFile = new File("D:\\江一燕.jpg");
//数据数据的目的地
File newFile = new File("D:\\我和江一燕.jpg");//相同路径是改名
// File newFile2 = new File("e:\\我和江一燕.jpg");//不同路径是剪切并改名
//实现改名
System.out.println(srcFile.renameTo(newFile));
}
目录的获取
| 方法名 | 说明 |
|---|---|
| public String[] list() | 返回一个String数组,表示该File目录中的所有子文件或目录。 |
| public File[] listFiles() | 返回一个File数组,表示该File目录中的所有的子文件或目录。 |
举例
//创建file
File file = new File("d:\\");
//获取e盘下所有的文件及目录
String[] list = file.list();
for(String s : list){
System.out.println(s);
}
System.out.println("------------------");
//创建file
File file2 = new File("d:\\");
//获取e盘下的所有file文件
File[] files = file2.listFiles();
for(File f : files){
System.out.println(f);
}
本文介绍了Java中的泛型,其主要目的是提升类型安全,将类型检查提前至编译时期。泛型可用于类、方法和接口,常见的通配符包括<?>、?extendsE和?superE。此外,文章还讨论了静态导入的三种方式以及可变参数的使用。在集合操作方面,讲解了数组与集合之间的转换,包括List到Set和反之的转换。最后,提到了File类的基本使用,如创建、删除、重命名文件和目录,以及列举目录内容。
1339

被折叠的 条评论
为什么被折叠?



