Java泛型中的通配符表达式
泛型上限: ?extends 最大泛型类型,则实例化时使用的泛型必须是最大泛型类型或其子类型;
package com.mldn;
class P
{
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.print();
P
pf.print();
P
pn.print();
int i = (Integer)pn.getX(); // Number –> Integer
System.out.println(i);
P pp = new P(20, 20); // 将得到警告:注意:./work/GenerDemo.java 使用了未经检查或不安全的操作。这是泛型擦除!
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
P
p1 = p2; // 将是错误的,因为p1、p2不再是类类型,而是泛型类型,如上举例,显然不同!
那么:fun(P
而: fun(P> p); 包含 fun(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
fun(new Str
}
public static void fun(Str super String> str) // 方法也可以使用泛型下限
{
System.out.println(“接收泛型下限以上的类型:” + str);
}
}
/*
administrator@xu-desktop:~$ javac -d . ./work/GenDemo.java
administrator@xu-desktop:~$ java com.mldn.GenDemo
泛型下限:String!String类型可以!
接收泛型下限以上的类型:com.mldn.Str@3e25a5
泛型下限:String!Object类型也可以!
接收泛型下限以上的类型:com.mldn.Str@19821f
*/
声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 嗅谱网
转载请注明:转自《Java泛型中的通配符表达式》
本文地址:http://www.xiupu.net/archives-59.html
关注公众号:
微信赞赏
支付宝赞赏