您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
【第10章:泛型】_通配符
发布时间:2020-12-22 17:09:00编辑:雪饮阅读()
泛型类型对象的接收
class Point<X,Y>{
private X x;
private Y y;
public void setX(X x){
this.x=x;
}
public void setY(Y y){
this.y=y;
}
public X getX(){
return this.x;
}
public Y getY(){
return this.y;
}
public Point(X x,Y y){
this.x=x;
this.y=y;
}
}
public class Hello{
public static void main(String args[]){
Point<Object,Object> p=new Point<Object,Object>("东经10.5",23);
fun(p);
}
public static void fun(Point<Object,Object> tmp){
System.out.println(tmp);
}
}
D:\>javac Hello.java
D:\>java Hello
Point@c17164
以上实例,在泛型实例化的时候给类指定的所有泛型类型变量值都是始祖类,而对于接收泛型类的实例化对象给fun方法时候同样是Object类,这样是没有问题的,但是如果new实例的时候指定的泛型类型都是小于Object的,而fun中接收仍是Object呢?
class Point<X,Y>{
private X x;
private Y y;
public void setX(X x){
this.x=x;
}
public void setY(Y y){
this.y=y;
}
public X getX(){
return this.x;
}
public Y getY(){
return this.y;
}
public Point(X x,Y y){
this.x=x;
this.y=y;
}
}
public class Hello{
public static void main(String args[]){
Point<String,Integer> p=new Point<String,Integer>("东经10.5",23);
fun(p);
}
public static void fun(Point<Object,Object> tmp){
System.out.println(tmp);
}
}
D:\>javac Hello.java
Hello.java:24: 无法将 Hello 中的 fun(Point<java.lang.Object,java.lang.Object>) 应用于 (Point<java.lang.String,java.lang.Integer>)
fun(p);
^
1 错误
虽然String与Integer都是Object的派生类,但泛型并不遵循常规类那一套,这也是泛型的继承限制。
那么对于泛型实例引用传递的接收方可以通过形参中取消显式的定义泛型类型变量也可以实现泛型类型的接收。
class Point<X,Y>{
private X x;
private Y y;
public void setX(X x){
this.x=x;
}
public void setY(Y y){
this.y=y;
}
public X getX(){
return this.x;
}
public Y getY(){
return this.y;
}
public Point(X x,Y y){
this.x=x;
this.y=y;
}
}
public class Hello{
public static void main(String args[]){
Point<String,Integer> p=new Point<String,Integer>("东经10.5",23);
fun(p);
}
public static void fun(Point tmp){
System.out.println(tmp);
}
}
D:\>javac Hello.java
D:\>java Hello
Point@c17164
或者用通配符实现对泛型类型实例的接收,比如这里用“?”通配符
这里“?”通配符表示任意类型的泛型变量类型
class Point<X,Y>{
private X x;
private Y y;
public void setX(X x){
this.x=x;
}
public void setY(Y y){
this.y=y;
}
public X getX(){
return this.x;
}
public Y getY(){
return this.y;
}
public Point(X x,Y y){
this.x=x;
this.y=y;
}
}
public class Hello{
public static void main(String args[]){
Point<String,Integer> p=new Point<String,Integer>("东经10.5",23);
fun(p);
}
public static void fun(Point<?,?> tmp){
System.out.println(tmp);
}
}
D:\>javac Hello.java
D:\>java Hello
Point@1fb8ee3
但是使用通配符接收的泛型实例不能够对泛型对象的属性进行写操作
class Point<X,Y>{
private X x;
private Y y;
public void setX(X x){
this.x=x;
}
public void setY(Y y){
this.y=y;
}
public X getX(){
return this.x;
}
public Y getY(){
return this.y;
}
public Point(X x,Y y){
this.x=x;
this.y=y;
}
}
public class Hello{
public static void main(String args[]){
Point<?,?> p=new Point<String,Integer>("东经10.5",23);
p.setY(24);
}
}
D:\>javac Hello.java
Hello.java:24: 无法将 Point<capture#532 of ?,capture#126 of ?> 中的 setY(capture#126 of ?) 应用于 (int)
p.setY(24);
^
1 错误
泛型上限
extends关键字用在形参的通配符之后表示对该通配符匹配到的泛型实例引用的接收定义一个泛型上限
class Point<X,Y>{
private X x;
private Y y;
public void setX(X x){
this.x=x;
}
public void setY(Y y){
this.y=y;
}
public X getX(){
return this.x;
}
public Y getY(){
return this.y;
}
public Point(X x,Y y){
this.x=x;
this.y=y;
}
}
public class Hello{
public static void main(String args[]){
Point<String,Integer> p=new Point<String,Integer>("东经10.5",23);
fun(p);
}
public static void fun(Point<?,? extends Number> tmp){
System.out.println(tmp);
}
}
D:\>javac Hello.java
D:\>java Hello
Point@c17164
这里fun方法的形参中对Point类泛型变量y做了上限Number的定义,而实例化Point时候泛型变量y是Integer的,所以这里也可以顺利接收。那么像是如下这种就违逆了这里设定的泛型上限。
class Point<X,Y>{
private X x;
private Y y;
public void setX(X x){
this.x=x;
}
public void setY(Y y){
this.y=y;
}
public X getX(){
return this.x;
}
public Y getY(){
return this.y;
}
public Point(X x,Y y){
this.x=x;
this.y=y;
}
}
public class Hello{
public static void main(String args[]){
Point<String,String> p=new Point<String,String>("东经10.5","23");
fun(p);
}
public static void fun(Point<?,? extends Number> tmp){
System.out.println(tmp);
}
}
D:\>javac Hello.java
Hello.java:24: 无法将 Hello 中的 fun(Point<?,? extends java.lang.Number>) 应用于 (Point<java.lang.String,java.lang.String>)
fun(p);
^
1 错误
泛型类声明处也可以对泛型变量定义泛型上限
class Point<X,Y extends Number>{
private X x;
private Y y;
public void setX(X x){
this.x=x;
}
public void setY(Y y){
this.y=y;
}
public X getX(){
return this.x;
}
public Y getY(){
return this.y;
}
public Point(X x,Y y){
this.x=x;
this.y=y;
}
}
public class Hello{
public static void main(String args[]){
Point<String,Integer> p=new Point<String,Integer>("东经10.5",23);
}
}
D:\>javac Hello.java
D:\>java Hello
同样的类的声明处泛型变量定义了泛型上限之后,则实例化该泛型类的时候也要遵守该泛型上限,否则编译不通过
class Point<X,Y extends Number>{
private X x;
private Y y;
public void setX(X x){
this.x=x;
}
public void setY(Y y){
this.y=y;
}
public X getX(){
return this.x;
}
public Y getY(){
return this.y;
}
public Point(X x,Y y){
this.x=x;
this.y=y;
}
}
public class Hello{
public static void main(String args[]){
Point<String,String> p=new Point<String,String>("东经10.5","23");
}
}
D:\>javac Hello.java
Hello.java:23: 类型参数 java.lang.String 不在其限制范围之内
Point<String,String> p=new Point<String,String>("东经10.5","23");
^
Hello.java:23: 类型参数 java.lang.String 不在其限制范围之内
Point<String,String> p=new Point<String,String>("东经10.5","23");
^
2 错误
泛型下限
super关键字用在泛型实例接收的形参处可以对接收的引用泛型实例限制泛型下限。
class Point<X,Y>{
private X x;
private Y y;
public void setX(X x){
this.x=x;
}
public void setY(Y y){
this.y=y;
}
public X getX(){
return this.x;
}
public Y getY(){
return this.y;
}
public Point(X x,Y y){
this.x=x;
this.y=y;
}
}
public class Hello{
public static void main(String args[]){
Point<String,String> p=new Point<String,String>("东经10.5","23");
fun(p);
}
public static void fun(Point<?,? super String> tmp){
System.out.println(tmp);
}
}
D:\>javac Hello.java
D:\>java Hello
Point@c17164
所以下面这种情况就属于是泛型下限违逆于接收泛型实例时
class Point<X,Y>{
private X x;
private Y y;
public void setX(X x){
this.x=x;
}
public void setY(Y y){
this.y=y;
}
public X getX(){
return this.x;
}
public Y getY(){
return this.y;
}
public Point(X x,Y y){
this.x=x;
this.y=y;
}
}
public class Hello{
public static void main(String args[]){
Point<String,Integer> p=new Point<String,String>("东经10.5",23);
fun(p);
}
public static void fun(Point<?,? super String> tmp){
System.out.println(tmp);
}
}
关键字词:java,泛型,通配符
上一篇:【第10章:泛型】_泛型入门