Java泛型中的通配符表达式

 

泛型上限: ?extends 最大泛型类型,则实例化时使用的泛型必须是最大泛型类型或其子类型;

package com.mldn;

 

class P // 泛型上限:Number类型;

{

private T x;

private T y;

 

public P(T x, T y)

{

this.x = x;

this.y = y;

}

 

public void print()

{

System.out.println(“X = ” + this.x);

System.out.println(“Y = ” + this.y);

}

 

public T getX()

{

return this.x;

}

}

 

public class GenerDemo

{

public static void main(String[] args)

{

P p = new P(10, 200); // Ok, Integer is Child Class of Number

p.print();

 

P pf = new P(10.3f, 20.56f); // ok, Float is also ChildClass of Number

pf.print();

 

P pn = new P(10, 200); // use 泛型上限 泛型擦除, need convert below

pn.print();

int i = (Integer)pn.getX(); // Number –> Integer

System.out.println(i);

 

P pp = new P(20, 20); // 将得到警告:注意:./work/GenerDemo. 使用了未经检查或不安全的操作。这是泛型擦除!

 

fun(p); // accept Integer

fun(pf); // accept Float

fun(pn); // accept Number

fun1(p); // 只接收Integer类

}

 

public static void fun(P> p) // ?是类型通配符,表示接收所有合法类型,这避免了使用Object或其他泛型上限时,不同泛型类型不支持相互传递

{

p.print();

}

 

public static void fun1(P extends Integer> p) // 将只能接收Integer类型或其 子类型;

{

System.out.println(“对方法使用通配符和泛型上限限制:Integer!”);

p.print();

}

}

 

/*

P p1 = new P(); // 好比整个的商品

P p2 = new P(); // 好比一个顾客购买的商品

p1 = p2; // 将是错误的,因为p1、p2不再是类类型,而是泛型类型,如上举例,显然不同!

那么:fun(P p); 将不能接收P p2泛型;

而: fun(P> p); 包含 fun(P p); 所有通配符解决了这个矛盾!

泛型上限:默认的上限是:Object,

显式声明格式: ? extends className, className表示泛型上限;

?super className , 下限;

*/

package com.mldn;

 

class Str

{

private T str;

 

public Str(T t)

{

this.str = t;

System.out.println(“泛型下限:String!” + str);

}

}

 

public class GenDemo

{

public static void main(String[] args)

{

fun(new Str(“String类型可以!”));

fun(new Str(“Object类型也可以!”));

}

 

public static void fun(Str super String> str) // 方法也可以使用泛型下限

{

System.out.println(“接收泛型下限以上的类型:” + str);

}

}

/*

administrator@xu-desktop:~$ javac -d . ./work/GenDemo.

administrator@xu-desktop:~$ com.mldn.GenDemo

泛型下限:String!String类型可以!

接收泛型下限以上的类型:com.mldn.Str@3e25a5

泛型下限:String!Object类型也可以!

接收泛型下限以上的类型:com.mldn.Str@19821f

 

*/

 

声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 智乐兔
转载请注明:转自《Java泛型中的通配符表达式
本文地址:https://www.zhiletu.com/archives-59.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

智乐兔官微