泛型

·泛型类:在jdk1.5之后提供了支持泛型的技术,也是java的一个新特性。
      ·掌握泛型的基本操作·掌握泛型的通配符作用·掌握泛型接口和泛型方法的使用
 
 泛型类的引入:要求设计一个可以表示坐标的类(X,Y),但是此类坐标可以同时满

足一下要求1)x=10、y=100;2)x=10.3、y=50.2;3)x=“东京180度”、y=“北纬310度”

。这个坐标该怎么设计?
 现在有3种类型的数据,int、float、String。
 int->Integer->Object;flaot->Float->Object;String->Object;
代码:
package org.demo;
class Point{
 private Object x;
 private Object y;
 public Object getX() {
  return x;
 }
 public Object getY() {
  return y;
 }
 public void setX(Object x) {
  this.x = x;
 }
 public void setY(Object y) {
  this.y = y;
 }
}

package org.demo;
public class GenDemo01 {
 public static void main(String args[]){
  Point p=new Point();
  p.setX(11);
  p.setY(20);
  int x=(Integer)p.getX();
  int y=(Integer)p.getY();
  System.out.println(x);
  System.out.println(y);
 }
}
该代码可以完成以上功能,但是存在一个问题,所有数据类型都可以被接受,程序的入口就

显得不那么规范了,而且存在安全漏洞。这就可以通过泛型来完成->此技术的最大特点就是

类中的属性的类型可以哟外部决定,而且生命类的时候应该采用如下形式:
class 类名称<泛型类型,泛型类型...>{

}
以上Point类可用泛型类:
package org.demo02;
class Point<T>{
 private T x;
 private T y;
 public T getX() {
  return x;
 }
 public T getY() {
  return y;
 }
 public void setX(T x) {
  this.x = x;
 }
 public void setY(T y) {
  this.y = y;
 }
}
可以发现一切的操作类型此时都不再有程序固定设置,而是由实例化对象时在外部进行指定


package org.demo02;
public class GenDemo05 {
 public static void main(String args[]){
  Point<String> p=new Point<String>();
  p.setX("东经22度");
  p.setY("西经33度");
  String x=p.getX();
  String y=p.getY();
  System.out.println(x);
  System.out.println(y);
 }
}
此时在使用Point类是只需加入属性声明即可,而且加入属性之后再取出属性的时候变得非

常容易。不用再使用向下转型。

·使用泛型的注意点:
 在使用泛型操作的时候,实际上有很多小的注意点,例如:构造方法上依然可以使

用泛型或者有一种称为泛型的擦除。
 在构造方法上应用泛型:
package org.demo03;
class Point<T>{
 private T x;
 private T y;
 public Point(T x,T y){
  this.x=x;
  this.y=y;
 }
 public T getX() {
  return x;
 }
 public T getY() {
  return y;
 }
 public void setX(T x) {
  this.x = x;
 }
 public void setY(T y) {
  this.y = y;
 }
}

package org.demo03;
public class GenDemo07 {
 public static void main(String args[]){
  Point<String> p=new Point<String>("East","West");
  String x=p.getX();
  String y=p.getY();
  System.out.println(x);
  System.out.println(y);
 }
}

·擦除泛型:如果在使用的时候没有指定泛型的话,则表示擦除泛型。
 泛型一旦擦除,将按照Object进行接收,以保证程序不出现错误。
package org.demo03;
public class GenDemo08 {
 public static void main(String args[]){
  Point p=new Point("East","West");//两个字符串按Object类型接收;
      //此句存在警告信息;
  String x=(String)p.getX();
  String y=(String)p.getY();
  System.out.println(x);
  System.out.println(y);
 }
}
可以通过<Object>进行消除警告信息:Point<Object> p=nw Point<Object>();但是多余(

脱了裤子放屁,多次一举了),而且有些搞笑。一般开发中泛型没必要擦除。

·通配符:
 在泛型的操作中通配符使用较多,而且在日后的系统类库中有很多地方都要使用这

些操作。例如:
public class Test {
 public static void main(String[] args) {
  Object obj="hello";
 }
}
以上代码实际上表示向上转型操作,因为String是Object的子类,但是在泛型中却没有此概

念。

·?:
 在进行对象转型的时候可以使用自动的向上转型,但是在使用泛型的时候却没有此

操作。
package org.demo04;
class Point<T>{
 private T x;
 private T y;
 public T getX() {
  return x;
 }
 public T getY() {
  return y;
 }
 public void setX(T x) {
  this.x = x;
 }
 public void setY(T y) {
  this.y = y;
 }
}

package org.demo04;
public class GenDemo09 {
 public static void main(String args[]){
  Point<Object> p1=new Point<Object>();
  Point<String> p2=new Point<String>();
  p1=p2;//此时无法转换,出现错误
 }
}
为什么不能转换呢,实际实际上此时 的程序已经不完全属于对象的转型操作了,属于一个

大的类型和一个小的类型的划分。
    例如:将“Point<Object> p1=new Point<Object>();”表示整个商场的全部商品,

“Point<String> p2=new Point<String>();”表示每一个顾客购买的商品。如果现在执行

“p1=p2”,那就意味着本顾客购买的商品就是整个商场的全部商品,这样可定说不通,所

以不能接收。
 不能使用以上的方式接收最大的影响在于方法的参数接受上,例如:
package org.demo04;

public class GenDemo10 {
 public static void main(String args[]){
  Point<Object> p1=new Point<Object>();
  Point<String> p2=new Point<String>();
  fun(p1);
  fun(p2);
 }
 public static void fun(Point po){//出现警告信息,如果用Point<Object>有会 

  //不能接收String类型,那么可以使用<?>:表示可以接受任意类型泛型。
  System.out.println(po.getX());
  System.out.println(po.getY());
 }
}
程序中的"?"表述可以接收任意泛型类型,但是只是接受和输出,并不能修改。

·泛型的上限:
 上限就是一个泛型的最大操作父类,例如,现在最大的上限设置为“Number”类型

,那么此时,又有能够接受的类型只能是Number及其子类(Intege)。
泛型上限设置通过一下语法完成:? extends 类;
例如:在Point类中只能设置数字的坐标;
class Point<T extends Number>{//无法接受字符串
 private T x;
 private T y;
 public T getX() {
  return x;
 }
 public T getY() {
  return y;
 }
 public void setX(T x) {
  this.x = x;
 }
 public void setY(T y) {
  this.y = y;
 }
}

public class GenDemo11 {
 public static void main(String args[]){
  Point<Integer> p1=new Point<Integer>();
  Point<Float> p2=new Point<Float>();
  //Point<String> p3=new Point<String>();出现错误,只能接受数字
 }
}

泛型的上限也可以在方法中使用:
package org.demo05;

public class GenDemo10 {
 public static void main(String args[]){
  Point<Float> p2=new Point<Float>();
  fun(p2);
 }
 public static void fun(Point<? extends Number> po){
  System.out.println(po.getX());
  System.out.println(po.getY());
 }
}
·泛型下限:泛型的下限是指只能设置其具体的类或者父类。即设置其最小的类型
 设置语法如下: ? super 类;
例如:定义一个方法,此方法只能接受String或Object类型的泛型对象。

package org.demo06;
class Point<T>{//还是以此类为例,标准泛型
 private T x;
 private T y;
 public T getX() {
  return x;
 }
 public T getY() {
  return y;
 }
 public void setX(T x) {
  this.x = x;
 }
 public void setY(T y) {
  this.y = y;
 }
}

package org.demo06;
public class GenDemo12 {
 public static void main(String args[]){
  Point<String>p1=new Point<String>();
  Point<Object>p2=new Point<Object>();
  fun(p1);
  fun(p2);
 }
 public static void fun(Point<? super String> po){//方法中设置泛型下限,最 

    //小不能小于String,最大不能大于Object;
  System.out.println(po.getX());
  System.out.println(po.getY());
 }
}

·泛型接口:与泛型类类似。语法:interface 接口名称<泛型类型...>
package org.demo07;

public interface Demo<T> {
 public void print(T param);
}
可以有两种实现方法:
方法一:package org.demo07;
public class DemoIm01<T> implements Demo<T> {
 public void print(T param) {
  System.out.println("param="+param);  
 }
}
测试:package org.demo07;
public class TestDemo {
 public static void main(String args[]){
  Demo<String> demo=new DemoIm01<String>();
  demo.print("heel");
 }
}

方法二:package org.demo07;
public class DemoIm01 implements Demo<DemoIm01> {
 public void print(DemoIm01 param) {
  System.out.println("param="+param);  
 }
}
测试:package org.demo07;
public class TestDemo {
 public static void main(String args[]){
  Demo<DemoIm01> demo=new DemoIm01();
  demo.print(new DemoIm01());
 }
}

·泛型方法:泛型除了在类中定义外,还可以在方法中定义,而且在方法上使用泛型,此方

法所在的类不一定是泛型操作。
例一:package org.demo08;
public class Demo {
 public <T>T print(T param){
  return param;
  }
}
package org.demo08;
public class GenDemo12 {
 public static void main(String args[]){
  Demo d=new Demo();
  System.out.println(d.print("hello"));
  System.out.println(d.print(2));
 }
}
例二:package org.demo08;
public class GenDemo13 {
 public static void main(String args[]) {
  Integer s[]=fun(1,2,3,4,5,6,654);
  for(int x:s)
   System.out.println(x);
 }

 public static <T> T[] fun(T ...param) {
  return param;

 }
}
·泛型的嵌套设置:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值