本篇内容介绍了“怎么使用Java泛型”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
创新互联是一家集网站建设,富裕企业网站建设,富裕品牌网站建设,网站定制,富裕网站建设报价,网络营销,网络优化,富裕网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
一般定义如下,即方法的前面加了个
public class FTest { publicList f(T t){...}; }
三种泛型参数推断方式:
1、直接在f()前面加确定泛型
fTest.f(xxx)
2、通过输入参数确定, 下面这个推断为Integer
int number = 0; fTest.f(number)
3、可通过 返回值 确定
Listlist = fTest.f(xxx);
Q: 下面这段代码哪里有问题? 是toString()那里吗?
public class A{ public static void test(T t){ System.out.println(t.toString()); } }
A:test是static方法, 因此无法感知A
需要改成
public static
toString()那里没问题,toString就是Object的方法。
Q: 泛型参数T在运行时,会变成什么?
A: 统一变成Object且不包含任何类型信息。
Q: 泛型参数T可以可以使用instanceof做比较吗?
class A{ void f(Object arg) if(arg instanceof T) { ... } }
A: 不能,编译器会报错。
Q: 泛型参数T可以进行new T()或者new T[]操作吗?
A: 不能,编译器会报错。
Q: 能调用泛型参数对象里的方法吗?
T.f();
A: 只能调用Object的方法。
Q: 可以用T做强制转化吗?
T t = (T)object;
A: 能运行, 但不会真正发生转型, 编译时会触发waring警告。
先假定有2个类, 基类Parent 和子类Child
class Parent{} class Child extends Parent{}
回答以下问题:
Q:下面这句话有问题吗?
Listlist = new ArrayList ()
A:有问题,编译就错误了。 List
Q:
List list = new ArrayList();
这个list有什么特点?
A:这个list可以调用A a = list.get(), 但是不能list.add(new Parent())
原因:
list.get()所做的操作是在返回时, 把内部的 强转成Parent, 是合理的,任何Parent的子类都可以转成Parent
list.add(new Parent())所做的操作是在输入时, 把外部的A转成内部的, 这是不合理的,因为我们不知道这个Parent对象可以转成哪个Parent的子类。
Q:
List list = new ArrayList();
这个list有什么特点?
下面谁会报错
list.add(new Child()) list.add(new Parent()) Parent a= list.get(); Child b = list.get()
A:截图如下:
Child c = list.get() 或者Parent p = list.get()所做的操作是在返回时, 把内部的 强转成外部的Parent或者child, 是不合理的, 因为编译器觉得child的父类 不一定 能转成parent或者child,所以禁止了这种行为( 比如parent的父类是object, 但object不一定就能转成parent或者child)。*list.add(new Child())所做的操作是在输入时, 把外部的child或者parent转成内部的, 这是合理的,因为child和parent一定能转成child的父类。
Q:
List list = new ArrayList();
ListfruitList = new ArrayList<>(); fruitList.add(new Fruit()); List appleList = new ArrayList<>(); appleList.add(new Apple()); fruitList.addAll(appleList); System.out.println(fruitList);
PECS原则
注意PECS原则和上面的区别!
上面之前提到的? extend或者? supert, 都是在声明对象的时候用的。
而PECS原则是用于泛型对象的方法输入参数!
public static class MyList{ List list = new ArrayList<>(); // 把输入参数塞给自己,类似于生产操作 public void pushList(List t) { list.addAll(t); } // 把自己的内容塞给输入参数,类似于让输入参数做消费。 public void pollList(List t) { t.addAll(list); } }
MyListmyList = new MyList<>(); List intList = new ArrayList<>(); myList.pushList(intList); List