public class Order {
String orderName;
int orderId;
//类的内部结构,就可以使用类的泛型
T orderT;
public Order(){
//编译不通过
// T[] arr = new T[20]
}
public Order(String orderName,int orderId,T orderT){
this.orderName =orderName;
this.orderId =orderId;
this.orderT = orderT;
}
public String getOrderName() {
return orderName;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
public int getOrderId() {
return orderId;
}
public void setOrderId(int orderId) {
this.orderId = orderId;
}
//如下的三个方法都不是泛型方法
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 copy(E[] arr){}
//泛型方法,在不在泛型类中都没有关系
//泛型方法可以是静态的:原因:泛型参数是在调用时确定的,并不是在实例化时确定的。
public static List copy(E[] arr){
ArrayList list = new ArrayList<>();
for (E e:arr){
list.add(e);
}
return list;
}
}
不是泛型类只是继承了泛型
public class SubOrder extends Order {//不是泛型类
//泛型方法,在不在泛型类中都没有关系
public static List copy(E[] arr){
ArrayList list = new ArrayList<>();
for (E e:arr){
list.add(e);
}
return list;
}
}
这种也是泛型类
public class SubOrder1 extends Order {//泛型类 }
1.如果定义了泛型类,实例化时没有指定类的泛型,则认为泛型的类型为Object类型
// Order order = new Order();
// order.setOrderT(123);
// order.setOrderT("ABC");
//要求,如果定义了为带泛型的类,建议在实例化时要指明泛型的类型
// Order order = new Order();
// order.setOrderT(123);
//带上泛型后,指明了类型
// order.setOrderT("ABC");
Order order = new Order<>("orderAA", 1001, "order:AA");
order.setOrderT("AA:hello");
// order.setOrderT(123);
2.由于子类在继承带泛型的父类时,指明了泛型的类型,则在子类实例化时,不在需要指明泛型的类型
SubOrder subOrder = new SubOrder();
subOrder.setOrderId(123);
SubOrder1 subOrder1 = new SubOrder1();
// subOrder1.setOrderT("AA");
subOrder1.setOrderT(123);
Order order = new Order<>();
Integer[] arr = new Integer[]{1,2,3,4};
//泛型方法在调用时,指明泛型参数的类型
List copy = order.copy(arr);//自定义泛型类中有该方法
System.out.println(copy);//[1, 2, 3, 4]
四、泛型在继承方面的体现
虽然类A是类B的父类,但是G< A > 和 G < B > 二者不是父类,为并列关系 类A是类B的父类 A< G > 是 B< G >的父类
@Test
public void test(){
Object obj = null;
String str = null;
obj = str;
List
类型相同,编译才不会报错
List list = null;
ArrayList list1 = null;
list = list1;
通配符的使用 通配符:?
类A是类B的父类,但是G< A > 和 G< B >为并列关系,二 者 共 同 的 父 类 为 G < ?>
List list1 = null;
List list2 = null;
List> list = null;
list = list1;
list = list2;
//编译通过
// print(list1);
// print(list2);
//使用通配符后,数据的读写要求
List list3 = new ArrayList<>();
list3.add("AA");
list3.add("BB");
list3.add("CC");
list =list3;
//添加(写入)报错,对于List>就不能向其内部添加数据,除了null以外
// list.add("DD");
list.add(null);
//获取(读取):允许读取数据,读取的类型为Object
Object o = list.get(0);
System.out.println(o);
public void print(List> list){
Iterator> iterator = list.iterator();
while (iterator.hasNext()){
Object next = iterator.next();
System.out.println(next);
}
}
有限制条件的通配符使用
Student类继承自Person ? extends Person ? super Student
? extends A :G< ? extends A > 可以看作G< A > 和 G < B >的父类,其中B是A的子类 ? super A:G< ? super A> 可以作为G< A > 和 G< B >的父类,其中B是A的子类
练习、如果遍历Map的key集,value集,key-value集,使用上泛型
Map map = new HashMap();
map.put("Tom",123);
//获取key集
Set strings = map.keySet();
for (String key:strings){
System.out.println(key);
}
//遍历value集
Collection values = map.values();
Iterator iterator = values.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
//遍历key-value集
Set> entries = map.entrySet();
Iterator> iterator1 = entries.iterator();
while (iterator1.hasNext()){
Map.Entry next = iterator1.next();
String key = next.getKey();
Integer value = next.getValue();
System.out.println(key +" +++++++++ " + value);
}
//提供一个方法用于遍历获取HashMap中的所有value,并存放到list集合中返回,使用泛型
public List getValueList(HashMap map){
ArrayList valueList = new ArrayList<>();
Collection values =map.values();
for (String value :values){
valueList.add(value);
}
return valueList;
}
五、泛型在开发中的使用场景
DAO:data(base) access object 数据访问对象
public class 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;
}
}
1、java.lang.IllegalStateException: Class invariant violation
at org.apache.log4j.LogManager.getLoggerRepository(LogManager.java:199)at org.apache.log4j.LogManager.getLogger(LogManager.java:228)
at o
hadoop jps出现process information unavailable提示解决办法
jps时出现如下信息:
3019 -- process information unavailable3053 -- process information unavailable2985 -- process information unavailable2917 --
<?php
class Image{
private $path;
function __construct($path='./'){
$this->path=rtrim($path,'/').'/';
}
//水印函数,参数:背景图,水印图,位置,前缀,TMD透明度
public function water($b,$l,$pos