向上转型作用于泛型

可将子类对象放入保存父类对象的容器内。

package com.htxx.action.business;

import java.util.ArrayList;
import java.util.List;

public class Cycle {
   void ride(Cycle c){
	   System.out.println("ride");
   }
   public static void main(String[] args) {
	   List<Cycle> list=new ArrayList<Cycle>();
	   list.add(new Unicycle());
	   list.add(new Bicycle());
	   list.add(new Tricycle());
	   for(Cycle c:list){
		   System.out.println(c.toString());
	   }

	   
}
}
class Unicycle extends Cycle{
	
}
class Bicycle extends Cycle{
	
}
class Tricycle extends Cycle{
	
}


中`extends`和`super`是用于处理边界的关键字,它们在 Java 编程中有着重要的作用。 ### 用法 - **`extends`的用法**:`List<? extends T>`表示该集合中存在的都是类`T`的子类,包括`T`自己。这样可以确保从集合中取出的元素类一定是`T`或者`T`的子类,从而在编译期间就保证类安全。例如,如果`T`是`Number`,那么这个集合可以存放`Integer`、`Double`等`Number`的子类对象[^1]。 - **`super`的用法**:`List<? super T>`表示该集合中存的都是类`T`的父类,包括`T`自己。这允许将`T`类或者`T`的子类对象添加到集合中,因为这些对象可以安全地向上转型为集合所允许的父类类[^1]。 ### 区别 - **数据流向不同**:`extends`侧重于数据的读取,因为可以确保从集合中取出的元素类是`T`或其子类。而`super`侧重于数据的写入,因为可以将`T`或其子类对象安全地添加到集合中。 - **类边界不同**:`extends`定义了的上界,即必须是`T`或`T`的子类;`super`定义了的下界,即必须是`T`或`T`的父类。 ### 相关知识 - **的好处**:最大的好处是可以提高代码的复用性。以`List`接口为例,使用可以将`String`、`Integer`等不同类放入`List`中,而不需要为每种类单独编写一个`List`接口,很好地解决了代码重复的问题[^3]。 - **与继承的关系**:在 Java 中,`extends`还常用于类的继承,子类通过`extends`关键字继承父类,从而获得父类的成员变量和成员方法。同时,`super`关键字用于在子类中引用父类对象,调用父类的构造函数或成员函数。例如,子类的构造函数中可以使用`super()`调用父类的无参构造函数,或者使用`super(参数)`调用父类的有参构造函数;在复写父类函数时,如果发现有重复代码,可以使用`super.父类成员函数`来调用父类的函数并添加自己需要的代码[^4]。 ### 代码示例 ```java import java.util.ArrayList; import java.util.List; class Animal {} class Dog extends Animal {} class Cat extends Animal {} public class GenericExample { public static void main(String[] args) { // 使用 extends List<? extends Animal> extendsList = new ArrayList<Dog>(); // 可以安全地读取 Animal animal = extendsList.get(0); // 不能添加元素,因为编译器无法确定具体类 // extendsList.add(new Dog()); // 编译错误 // 使用 super List<? super Dog> superList = new ArrayList<Animal>(); // 可以添加 Dog 或其子类对象 superList.add(new Dog()); // 读取元素时,只能得到 Object 类 Object obj = superList.get(0); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值