class Person {// 使用T类型定义变量private T info;// 使用T类型定义一般方法public T getInfo() {return info;
}
public void setInfo(T info) {this.info = info;
}
// 使用T类型定义构造器
public Person() {
}
public Person(T info) {this.info = info;
}
public class DAO {public E get(int id, E e) {E result = null;return result;}
}
public static void fromArrayToCollection(T[] a, Collection c) {for (T o : a) {c.add(o);}
}
public static void main(String[] args) {Object[] ao = new Object[100];Collection
class Creature{}
class Person extends Creature{}
class Man extends Person{}
class PersonTest {public static void test(T t) {System.out.println(t);}public static void main(String[] args) {test(new Person());test(new Man());//The method test(T) in the type PersonTest is not //applicable for the arguments (Creature)test(new Creature());}
}
2.4 自定义泛型类型代码演示
import org.junit.Test;import java.util.ArrayList;
import java.util.List;/** 如何自定义泛型结构:泛型类、泛型接口;泛型方法。** 1. 关于自定义泛型类、泛型接口:*/
public class GenericTest1 {@Testpublic void test1() {//如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为Object类型//要求:如果大家定义了类是带泛型的,建议在实例化时要指明类的泛型。Order order = new Order();order.setOrderT(123);order.setOrderT("ABC");//建议:实例化时指明类的泛型Order order1 = new Order("orderAA", 1001, "order:AA");order1.setOrderT("AA:hello");}@Testpublic void test2() {SubOrder sub1 = new SubOrder();//由于子类在继承带泛型的父类时,指明了泛型类型。则实例化子类对象时,不再需要指明泛型。sub1.setOrderT(1122);SubOrder1 sub2 = new SubOrder1<>();sub2.setOrderT("order2...");}@Testpublic void test3() {ArrayList list1 = null;ArrayList list2 = new ArrayList();//泛型不同的引用不能相互赋值。//list1 = list2;Person p1 = null;Person p2 = null;p1 = p2;}//测试泛型方法@Testpublic void test4() {Order order = new Order<>();Integer[] arr = new Integer[]{1, 2, 3, 4};//泛型方法在调用时,指明泛型参数的类型。List list = order.copyFromArrayToList(arr);System.out.println(list);}
}
import java.util.ArrayList;
import java.util.List;/*** 自定义泛型类*/
public class Order {String orderName;int orderId;//类的内部结构就可以使用类的泛型T orderT;public Order() {//编译不通过//T[] arr = new T[10];//编译通过T[] arr = (T[]) new Object[10];}public Order(String orderName, int orderId, T orderT) {this.orderName = orderName;this.orderId = orderId;this.orderT = orderT;}//如下的三个方法都不是泛型方法public T getOrderT() {return orderT;}public void setOrderT(T orderT) {this.orderT = orderT;}@Overridepublic String toString() {return "Order{" +"orderName='" + orderName + '\'' +", orderId=" + orderId +", orderT=" + orderT +'}';}
// 静态方法中不能使用类的泛型。
// public static void show(T orderT) {
// System.out.println(orderT);
// }public void show() {//编译不通过
// try{
//
// } catch(T t) {
//
// }}//泛型方法:在方法中出现了泛型的结构,泛型参数与类的泛型参数没有任何关系。//换句话说,泛型方法所属的类是不是泛型类都没有关系。//泛型方法,可以声明为静态的。原因:泛型参数是在调用方法时确定的。并非在实例化类时确定。public static List copyFromArrayToList(E[] arr) {ArrayList list = new ArrayList<>();for (E e : arr) {list.add(e);}return list;}
}
import java.util.ArrayList;
import java.util.List;public class SubOrder extends Order {//SubOrder:不是泛型类public static List copyFromArrayToList(E[] arr) {ArrayList list = new ArrayList<>();for (E e : arr) {list.add(e);}return list;}
}
public class SubOrder1 extends Order {//SubOrder1:仍然是泛型类
}
public static void main(String[] args) {List> list = null;list = new ArrayList();list = new ArrayList();// list.add(3);//编译不通过list.add(null);List l1 = new ArrayList();List l2 = new ArrayList();l1.add("尚硅谷");l2.add(15);read(l1);read(l2);
}
public static void read(List> list) {for (Object o : list) {System.out.println(o);}
}
3.2 注意点
注意点1:编译错误:不能用在泛型方法声明上,返回值类型前面<>不能使用?
public static > void test(ArrayList> list) {
}
注意点2:编译错误:不能用在泛型类的声明上
class GenericTypeClass> {
}
注意点3:编译错误:不能用在创建对象上,右边属于创建集合对象
ArrayList> list2 = new ArrayList>();
3.3 有限制的通配符
>
允许所有泛型的引用调用
通配符指定上限
上限extends:使用时指定的类型必须是继承某个类,或者实现某个接口,即<=
通配符指定下限
下限super:使用时指定的类型不能小于操作的类,即>=
举例: extends Number> (无穷小 , Number]
只允许泛型为Number及Number子类的引用调用
super Number> [Number , 无穷大)
只允许泛型为Number及Number父类的引用调用
extends Comparable>
只允许泛型为实现Comparable接口的实现类的引用调用
public static void printCollection3(Collection extends Person> coll) {//Iterator只能用Iterator>或Iterator extends Person>.why?Iterator> iterator = coll.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}
}
public static void printCollection4(Collection super Person> coll) {//Iterator只能用Iterator>或Iterator super Person>.why?Iterator> iterator = coll.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}
}