好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

初识Java泛型

学习一时爽,一直学习一直爽

    Hello,大家好,我是 もうり,一个从无到有的技术+语言小白。

https://blog.csdn.net/weixin_44510615/article/details/102718400

https://blog.csdn.net/weixin_44510615/article/details/102688746

Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

泛型解决的问题

 import java.util.ArrayList; import java.util.List; /**  * @author: 毛利  */ public class Test {     public static void main(String[] args) {          List arrayList = new ArrayList();         // 字符1和数字1         arrayList.add("1");         arrayList.add(1);         for (int i = 0 ;i<arrayList.size();i++){             String item = (String)arrayList.get(i);             /*             Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String              */             System.out.println(item);         }     } }  

一个String类型,一个Integer类型,再使用时都以String的方式使用,程序就崩溃了。

所以Java不服,老子是编程语言boss,怎么出现这个问题,Java 泛型(generics)就出来了

泛型方法

 public class Test {     public static void main(String[] args) {         List<String> arrayList = new ArrayList<String>();         // 字符1和数字1         arrayList.add("1");          arrayList.add(1);         for (int i = 0 ;i<arrayList.size();i++){             String item = (String)arrayList.get(i);             /*             Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String              */             System.out.println(item);         }     } }  

所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中的)。

每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。

类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。

泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像int,double,char的等)。

 /**  * @author: 毛利  */ public class GenericMethodTest {     // 泛型方法 printArray     public static < E > void printArray( E[] inputArray )     {         // 输出数组类型         System.out.println(inputArray);         // 输出数组元素         for ( E element : inputArray ){             System.out.printf( "%s ", element );         }         System.out.println();     }      public static void main( String args[] )     {         // 创建不同类型数组:Integer, Double 和 Character         Integer[] intArray = { 1, 2, 3, 4, 5 };         Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };         Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };          System.out.println( "整型数组元素为:" );         printArray( intArray  ); // 传递一个整型数组          System.out.println( "\n双精度型数组元素为:" );         printArray( doubleArray ); // 传递一个双精度型数组          System.out.println( "\n字符型数组元素为:" );         printArray( charArray ); // 传递一个字符型数组     } }  

泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法

泛型类

泛型类是对类型进行参数化的类或接口。

 /**  * @author: 毛利  */ public class Box {     private String object;     public  void  set(String object){         this.object = object;     }     public void get(){         System.out.println(object);     }      public static void main(String[] args) {         Box box = new Box();         box.set("maoli");         box.get();     } }  

这是常见的做法,这样做的一个坏处是Box里面现在只能装入String类型的元素maoli,今后如果我们需要装入Integer等其他类型的元素,还必须要另外重写一个Bo类

所以在 Box添加类型就这么解决了

 /**  * @author: 毛利  */ public class Box<T> {     private T t;     public  void  set(T t){         this.t = t;     }     public void get(){         System.out.println(t);     }     public static void main(String[] args) {         Box<Integer> Integerbox = new Box<Integer>();         Integerbox.set(123);         Integerbox.get();          Box<Double> Doublerbox = new Box<Double>();         Doublerbox.set(123.0);         Doublerbox.get();          Box<String> Stringbox = new Box<String>();         Stringbox.set("maoli");         Stringbox.get();      } }  

回顾泛型类

 import java.util.ArrayList; import java.util.List;  /**  * @author: 毛利  */ public class Demo<T> {     // 创建了一个操作List集合的泛型方法,     private List<T> list = new ArrayList<T>();     public void add(T t){         list.add(t);     }      public static void main(String[] args) {         //测试一下这个泛型方法,先向集合中添加一条String类型的数据,然后打印List集合中的元素。         Demo demo = new Demo();         String t1 = "this is a demo";         Integer t2 = 123;         demo.add(t1);         demo.add(t2);         // this is a demo         System.out.println(demo.list.get(0));         // [this is a demo, 123]         System.out.println(demo.list);     } }  

泛型接口

定义一个接口

 //接口泛型的使用方法 interface Interface<T> {      void test(T t);    //T表示test返回的是T类型的值,T代指了一个类型,比如String、Integer等等。 }   // 接口InterfaceImp1 class InterfaceImp1<T> implements Interface<T> {     //子类实现接口时候继续保留泛型     @Override     public void  test(T t) {         System.out.println(t);     } } class InterfaceImp2 implements Interface<String>{     //子类实现接口时确定好泛型类型     @Override     public void test(String s) {         System.out.println(s);     } }  
 /**  * @author: 毛利  */ public class demo {     public static void main(String[] args) {         Interface in = new InterfaceImp1<Integer>();         in.test(123);          InterfaceImp2  in2 = new InterfaceImp2();         in2.test("5");     } }   123 5  

若有不对之处,请批评指正,望共同进步,谢谢!

查看更多关于初识Java泛型的详细内容...

  阅读:36次

上一篇: Graphviz

下一篇:Matplotlib的朋友Basemap