zoukankan      html  css  js  c++  java
  • 泛型简介,泛型类及使用

    如果我们需要产生多个对象,每个对象的逻辑完全一样,只是对象内的成员变量的类型不同。那么我们该如何去做?

    ①   创建多个类文件,给每个类中的成员变量设置指定的数据类型;

     1 public class Demo1{
     2     public static void main(String []args){
     3         MyClass1 myclass1=new MyClass1("张三");
     4         System.out.println(myclass1.getData());
     5         MyClass2 myclass2=new MyClass2(10);
     6         System.out.println(myclass2.getData());
     7     }
     8 }
     9 
    10 class MyClass1{
    11     private String data;
    12     public MyClass1(String data){
    13         this.data=data;
    14     }
    15     
    16     public void setData(String data){
    17         this.data=data;
    18     }
    19     public String getData(){
    20         return data;
    21     }
    22 }
    23 
    24 class MyClass2{
    25     private int data;
    26     public MyClass2(int data){
    27         this.data=data;
    28     }
    29     
    30     public void setData(int data){
    31         this.data=data;
    32     }
    33     public int getData(){
    34         return data;
    35     }
    36 }
    View Code

    缺点:这种方式会导致类的膨胀,重用性太差;

    ①   创建一个类文件,给这个类中的成员变量设置Object数据类型;

     1 public class Demo11{
     2     public static void main(String []args){
     3         MyClass myClass1=new MyClass("张三");
     4         System.out.println((String)myClass1.getData());
     5         MyClass myClass2=new MyClass(10);
     6         System.out.println((Integer)myClass2.getData());
     7         //以上可以执行
     8         //但int类型不能装换为String类型
     9         System.out.println((String)myClass2.getData());
    10     }
    11 }
    12 
    13 class MyClass{
    14     private Object data;
    15     public MyClass(Object data){
    16         this.data=data;
    17     }
    18     
    19     public void setData(Object data){
    20         this.data=data;
    21     }
    22     public Object getData(){
    23         return data;
    24     }
    25 }
    View Code

    缺点:编译时正常,但运行时可能会异常;

     

    泛型类就能解决以上两个问题;

    泛型简介

    ①   泛型是JDK4.5引入的新特性,也是最重要的一个特性;

    ②   泛型可以再编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的;

    ③   泛型的原理就是“类型的参数化”,即把类型看作参数。也就是说把所要操作的数据类型看作参数,就像方法的形式参数是运行时传递的值的占位符一样;

    ④   简单的说,类型变量扮演的角色就如同一个参数,它提供给编译器用来类型检查的信息;

    ⑤   泛型可以提高代码的扩展性和重用性;

    总结:所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型,泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用;

    泛型类示例:

     1 public class GenClass <T>{
     2     private T obj;
     3     public GenClass(T obj){
     4     this.obj=obj;
     5 }
     6 public T getObj(){
     7     return obj;
     8 }
     9 public void setObj(T obj){
    10     this.obj=obj;
    11 }
    12 }

    T代表类型,比如Integer,String

    用泛型类解决以上问题

     1 public class GenericDemo1{
     2     public static void main(String []args){
     3         //创建一个泛型类对象
     4         GenClass<String> gen1=new GenClass<String>("张三");
     5         System.out.println(gen1.getData());
     6         GenClass<Integer> gen2=new GenClass<Integer>(10);
     7         System.out.println(gen2.getData());
     8         //使用了泛型之后再做强制类型转换编译无法通过
     9         //System.out.println((String)gen2.getData());
    10     }
    11 }
    12 
    13 //创建一个泛型类
    14 class GenClass<T>{
    15     private T data;
    16     public GenClass(T data){
    17         this.data=data;
    18     }
    19     
    20     public void setData(T data){
    21         this.data=data;
    22     }
    23     public T getData(){
    24         return data;
    25     }
    26 }
    View Code

    泛型的用法

    ① 泛型的参数类型可以使泛型类;

     1 public class GenericDemo1{
     2     public static void main(String []args){
     3         //一个泛型类作为另一个泛型类的参数
     4         GenClass<GenClass<Student>> gen1=new GenClass<GenClass<Student>>();
     5         GenClass<Student> gen2=new GenClass<Student>();
     6         gen2.setData(new Student("张三"));
     7         gen1.setData(gen2);
     8         
     9         System.out.println(gen1.getData().getData());
    10     }
    11 }
    12 
    13 //创建一个泛型类
    14 class GenClass<T>{
    15     private T data;
    16     public GenClass(){
    17         
    18     }
    19     public GenClass(T data){
    20         this.data=data;
    21     }
    22     
    23     public void setData(T data){
    24         this.data=data;
    25     }
    26     public T getData(){
    27         return data;
    28     }
    29 }
    30 
    31 class Student{
    32     private String name;
    33     public Student(String name){
    34         this.name=name;
    35     }
    36     public String toString(){
    37         return "我是:"+name;
    38     }
    39 }
    View Code

    ② 泛型类可以同时设置多个类型参数;

     1 public class GenericDemo1{
     2     public static void main(String []args){
     3         //带2个参数的泛型
     4         GenClass2<String,Integer> gen1=new GenClass2<String,Integer>("张三",20);
     5         System.out.println(gen1.getData1());
     6         System.out.println(gen1.getData2());
     7     }
     8 }
     9 
    10 class GenClass2<T1,T2>{
    11     private T1 data1;
    12     private T2 data2;
    13     public GenClass2(T1 data1,T2 data2){
    14         this.data1=data1;
    15         this.data2=data2;
    16     }
    17     public T1 getData1(){
    18         return data1;
    19     }
    20     public T2 getData2(){
    21         return data2;
    22     }
    23 }
    View Code

    ③ 泛型类可以继承泛型类;

     1 public class GenericDemo2{
     2     public static void main(String []args){
     3         //一个泛型类继承另一个泛型类
     4         SubClass<String,Integer> sub=new SubClass<String,Integer>("张三",20);
     5         System.out.println(sub.show1());
     6     }
     7 }
     8 
     9 class SuperClass<T1>{
    10     private T1 var1;
    11     public SuperClass(T1 var1){
    12         this.var1=var1;
    13     }
    14     
    15     public T1 show1(){
    16         return var1;
    17     }
    18 }
    19 
    20 class SubClass<T1,T2> extends SuperClass<T1>{
    21     private T2 var2;
    22     public SubClass(T1 var1,T2 var2){
    23         super(var1);
    24         this.var2=var2;
    25     }
    26     //重写父类的方法
    27     public T1 show1(){
    28         return super.show1();
    29     }
    30 }
    View Code

    ④泛型类可以实现泛型接口;

     1 public class GenericDemo2{
     2     public static void main(String []args){
     3         //一个泛型类继承另一个泛型类
     4         SubClass<String,Integer> sub=new SubClass<String,Integer>("张三",20);
     5         System.out.println(sub.show1());
     6         //实现接口的方法
     7         sub.show2(100);
     8     }
     9 }
    10 
    11 class SuperClass<T1>{
    12     private T1 var1;
    13     public SuperClass(T1 var1){
    14         this.var1=var1;
    15     }
    16     
    17     public T1 show1(){
    18         return var1;
    19     }
    20 }
    21 
    22 interface IInfo<T2>{
    23     public void show2(T2 var3);
    24 }
    25 
    26 class SubClass<T1,T2> extends SuperClass<T1> implements IInfo<T2>{
    27     private T2 var2;
    28     public SubClass(T1 var1,T2 var2){
    29         super(var1);
    30         this.var2=var2;
    31     }
    32     //重写父类的方法
    33     public T1 show1(){
    34         return super.show1();
    35     }
    36     //实现接口的方法
    37     public void show2(T2 var3){
    38         System.out.println(var3);
    39         System.out.println(var2);
    40         //虽然都是Integer类型,但泛型会先将其转为Object类型,所以不能相加
    41         //System.out.println(var2+var3);
    42     }
    43 }
    View Code
  • 相关阅读:
    const关键字在C和C++区别
    配置Office DOM组件权限
    SQL-Server新建表,当前日期为表名
    通过css样式给表格tbody加垂直滚动条
    Linq 左连接 left join
    如何在SVN服务器上创建项目
    C# 实现实体类和Xml转换
    C# 导出Excel表格
    SQL语句和EF Group by 用法
    C# fileUpload视频上传
  • 原文地址:https://www.cnblogs.com/wzy330782/p/5339180.html
Copyright © 2011-2022 走看看