Java泛型学习理解
Java泛型
这里是看了鱼哥之后对于泛型的理解
泛型的作用:
我认为泛型就是为了让一个函数更加的灵活多变,一个简单的例子:
AI零代码开发平台这个项目里的,模版类设计,中对于多文件类型(multifile)和单文件类型(htmlfile)这两种的 处理,采用的定义一种方法,设计成统一的saveCode(T result)方法。
在之后调用的时候就不需要考虑这个是单文件类型还是多文件类型,直接代入就好了,然后是模版方法这个父类和两个 继承方法,这时候不同类型的result参数去各自的子类方法里各自实现具体的保存文件业务代码
泛型会遇到的问题
泛型的擦除机制
泛型在使用的时候,编译前不管,先说编译之后的运行,我没搞清楚是为了省内存还是怎么的,在运行的时候不管是List 还是 Map 然后调用给的值是String,不管是哪个,在运行的时候都是List类型或者Map类型,不会有具体类型。
泛型不同类型混用
这时候就要问了,那这样没有类型区别,不是Integer类型赋给StringString赋给Integer? 但是实际上并不会,因为会出现一下情况
java
▼text复制代码// 泛型方法:返回类型是 T,参数也是 T public static <T> T getFirst(List<T> list) { return list.get(0); } public static void main(String[] args) { List<String> stringList = Arrays.asList("hello", "world"); List<Integer> intList = Arrays.asList(1, 2, 3); // ✅ 正确:T 被推断为 String String result1 = getFirst(stringList); // result1 = "hello" // ✅ 正确:T 被推断为 Integer Integer result2 = getFirst(intList); // result2 = 1 // ❌ 错误:编译期报错!不能把 String 赋给 Integer Integer result3 = getFirst(stringList); // 编译错误: incompatible types: inference variable T has incompatible bounds // equality constraints: Integer // lower bounds: String // ❌ 错误:更离谱的,直接赋值也是编译错误 Integer i = "hello"; // 编译错误: 不兼容的类型 } ```
所以,在编译阶段,就会去判断这个数据类型是无法通过的
泛型上下边界
这里对于上下界的理解我是这样的,读取的时候返回的值规定为某种类型,对于这个类的子类也是可以被定义的,我这里举个例子:
java
▼text复制代码// 这里父类是商品类 public class Product // 创建子类手机继承父类商品类 public class Phone extend Product // 假设有一个购买方法,这里这里请求的参数类型就可以是, // 父类Product下的子类,也就是包括Phone在内的所有子类,这样参数的类型就灵活了 public static Product buyGoods(List<? extends Product> products) // 同时它可以把返回类型也设定的灵活 // 这样返回类型也可以是父类product里的子类 public static Optional<? extends Product> buyGoods(List<? extends Product> products) ```
这里需要注意一个事情就是,上界是extends,这是只负责读取操作不负责写入,是作为生产者
下界
这里就简单说一下我的理解,上界的extends传过来的值就是给我看的不能修改,保证了原始数据的干净,想要处理这个数据然后返回给用户,就需要创建一个对象,将它赋值,然后处理返回。 下界就是把传入的值就是这个对象,直接进行写入操作。这里举个例子:
java
▼text复制代码public static void addToBasket(List<? super Apple> basket) { // ✅ 直接修改传入的参数,往里加元素 basket.add(new Apple()); basket.add(new RedApple()); // basket 被修改了,调用方能看到变化 }
如果想要查看内容,就需要使用方法查看。
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
