Java 泛型系列练习
GenericsExercise
package genericsExercise;
import pojo.MyList;
public class GenericsExercise {
public static void main(String[] args) {
// 泛型可以用在类、方法、接口中
// 泛型类
// 在自定义MyList类中限定泛型为String,那么该MyList对象只能添加String类型的元素
MyList<String> myList = new MyList<>();
// 添加String类型的元素成功
myList.add("hello");
myList.add("world");
// 添加非String类型元素失败,编译时报错
// myList.add(123);
// myList.add('a');
// 获得集合中元素,无需进行类型转换即可使用子类的特有方法
// 因为有了泛型,在实现get方法的时候,就可以直接进行类型转换了,集合中只有一种类型的元素,所以说转换不会报错
byte[] bytes = myList.get(0).getBytes();
for (byte aByte : bytes) {
System.out.println(aByte);
}
System.out.println(myList.getSize());
}
}
泛型继承:泛型不能继承;但是数据可以继承
GenericsExtendsExercise
package genericsExercise;
import java.util.ArrayList;
/**
* 泛型继承
* 泛型不具备继承性!
* 但是数据是具备继承性的
*
*/
public class GenericsExtends {
public static void main(String[] args) {
ArrayList<GrandFather> arrayList1 = new ArrayList<>();
ArrayList<Father> arrayList2 = new ArrayList<>();
ArrayList<Son> arrayList3 = new ArrayList<>();
// 验证泛型不具备继承性
// 方法中的ArrayList的泛型限定为GrandFather,若泛型具备继承性,那么传递List1、2、3都可以成功调用这个方法
// 但是传递List2、3调用这个方法都编译报错了:
// 需要的类型:ArrayList<GrandFather>提供的类型:ArrayList<Father>
// 需要的类型:ArrayList<GrandFather>提供的类型:ArrayList<Son>
// 这就可以说明泛型是不具备继承性的
// testMethod(arrayList1);
// testMethod(arrayList2);
// testMethod(arrayList3);
// 验证数据具备继承性
// 在添加集合中的数据的时候,是具备继承性的,添加泛型限定类的子类也是可以的
// 就像是集合的原始使用,其中底层数组是Object,所以说可以添加Object的子类(也就是一切类)
// arrayList1.add(new GrandFather());
// arrayList1.add(new Father());
// arrayList1.add(new Son());
// 泛型通配符的使用
// 使用泛型通配符:<? extends GrandFather> 此处的泛型就可以是一切GrandFather的子类
method(arrayList1);
method(arrayList2);
method(arrayList3);
method2(arrayList1);
method2(arrayList2);
method2(arrayList3);
// 使用泛型通配符:<? super Son> 此处的泛型就可以是一切Son的父类
}
/**
* 测试泛型不具备继承性的方法
*
* @param arrayList
*/
public static void testMethod(ArrayList<GrandFather> arrayList) {
System.out.println(arrayList);
}
/**
* 测试泛型通配符的方法
* 可以使用泛型通配符
* 无界通配符 ? 代表一切对象
* 上界通配符 ? extends Object 代表一切Object的子类(包括Object本身)
* 下界通配符 ? super Object 代表一切Object的父类(包括Object本身)
* @param arrayList
*/
public static void method(ArrayList<? extends GrandFather> arrayList) {
// 可以使用一切GrandFather的子类
System.out.println(arrayList);
}
public static void method2(ArrayList<? super Son> arrayList) {
// 可以使用一切Son的父类
System.out.println(arrayList);
}
}
/**
* 这是三个简单的类,其中具备一个简单的继承结构,只是为了验证泛型的继承性
*/
class GrandFather {}
class Father extends GrandFather{}
class Son extends Father{}
泛型方法
package genericsExercise;
/**
* 泛型方法
* 因为不知道方法具体可以接收什么类型的参数,所以说可以使用泛型方法,用泛型的方法指代具体的参数方法
*/
public class GenericsMethod {
public static void main(String[] args) {
// 因为是泛型方法,可以传递任何类型的参数
printWord("hello");
printWord(123);
printWord('a');
printWord(new Student("张三", 18));
}
/**
* 一个简单的打印方法,但是因为不知道具体要打印什么类型的参数,所以说需要使用泛型
*
* @param t
* @param <T>
*/
public static <T> void printWord(T t) {
System.out.println(t);
}
}
class Student{
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student: " + this.name + " age: " + this.age;
}
}
原文地址:https://blog.csdn.net/Aishangyuwen/article/details/143824399
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!