java自定义类型和泛型_java 面向对象(三十四):泛型三 自定义泛型类、泛型接口、泛型方法...

1.举例:

3261cce84d531bb17b20112813d07e17.gif

【Order.java】

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;

}

@Override

public 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;

}

}

【SubOrder.java】

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;

}

}

//实例化时,如下的代码是错误的

SubOrder o = new SubOrder<>();

【SubOrder1.java】

public class SubOrder1 extends Order {//SubOrder1:仍然是泛型类

}

【测试】

@Test

public 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");

}

@Test

public void test2(){

SubOrder sub1 = new SubOrder();

//由于子类在继承带泛型的父类时,指明了泛型类型。则实例化子类对象时,不再需要指明泛型。

sub1.setOrderT(1122);

SubOrder1 sub2 = new SubOrder1<>();

sub2.setOrderT("order2...");

}

@Test

public void test3(){

ArrayList list1 = null;

ArrayList list2 = new ArrayList();

//泛型不同的引用不能相互赋值。

// list1 = list2;

Person p1 = null;

Person p2 = null;

p1 = p2;

}

//测试泛型方法

@Test

public void test4(){

Order order = new Order<>();

Integer[] arr = new Integer[]{1,2,3,4};

//泛型方法在调用时,指明泛型参数的类型。

List list = order.copyFromArrayToList(arr);

System.out.println(list);

}

3261cce84d531bb17b20112813d07e17.gif

2.注意点:

b279f472b3ddb14bc20f9bc9eaca93c5.png

72f596a14f7bc6aeb70e50d15e2ca936.png

3.应用场景举例:

【DAO.java】:定义了操作数据库中的表的通用操作。 ORM思想(数据库中的表和Java中的类对应)

3261cce84d531bb17b20112813d07e17.gif

public class DAO {//表的共性操作的DAO

//添加一条记录

public void add(T t){

}

//删除一条记录

public boolean remove(int index){

return false;

}

//修改一条记录

public void update(int index,T t){

}

//查询一条记录

public T getIndex(int index){

return null;

}

//查询多条记录

public List getForList(int index){

return null;

}

//泛型方法

//举例:获取表中一共有多少条记录?获取最大的员工入职时间?

public E getValue(){

return null;

}

}

【CustomerDAO.java】:

public class CustomerDAO extends DAO{//只能操作某一个表的DAO

}

【StudentDAO.java】:

public class StudentDAO extends DAO {//只能操作某一个表的DAO

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值