与非泛型代码相比,使用泛型的程序有很多好处。

代码重用:使用泛型,只需编写一次方法/类/接口一次,即可用于任何类型。 在非泛型中,需要在需要时一次又一次地编写代码。
类型安全性:与在运行时相比,泛型在显示编译时会出错(最好在编译时知道代码中的问题,而不是使代码在运行时失败)。

例如:创建一个存储学生姓名的ArrayList,如果程序员错误地添加了一个整数对象而不是字符串,则编译器允许它。 但是,当从ArrayList检索此数据时,它将在运行时导致非通用ArrayList出现问题。

// A Simple Java program to demonstrate that NOT using 
// generics can cause run time exceptions 

import java.util.*; 

class Test { 
    public static void main(String[] args) 
    { 
        // Creating an ArrayList without any type specified 
        ArrayList al = new ArrayList(); 

        al.add("One"); 
        al.add("Two"); 
        al.add(10); // Compiler allows this 

        String s1 = (String)al.get(0); 
        String s2 = (String)al.get(1); 

        try { 
            // Causes Runtime Exception 
            String s3 = (String)al.get(2); 
        } 
        catch (Exception e) { 
            System.out.println("Exception: " + e); 
        } 
    } 
}

运行结果如下:

Exception:
 java.lang.ClassCastException:
 java.lang.Integer cannot be cast to java.lang.String

泛型如何解决此问题:如果将此列表设为泛型,则在任何其他情况下,它将仅使用String对象并引发编译时错误。

// Using generics converts run time exceptions into 
// compile time errors 

import java.util.*; 

class Test { 
    public static void main(String[] args) 
    { 
        // Creating an ArrayList with String specified 
        ArrayList<String> al = new ArrayList<String>(); 

        al.add("Sachin"); 
        al.add("Rahul"); 

        // Now Compiler doesn't allow this 
        al.add(10); 

        String s1 = al.get(0); 
        String s2 = al.get(1); 
        String s3 = al.get(2); 
    } 
}

运行结果时间:

15: error: no suitable method found for add(int)
        al.add(10); 
          ^

不需要单独的类型转换:如果不需要泛型,则在上面的示例中,每次要从ArrayList检索数据时,都需要进行类型转换。 在每个检索操作中进行类型转换都是一个很大的麻烦。 如果已经通过某种方式知道列表仅保存字符串数据,则可以避免这种情况。
例如:

// A Simple Java program to demonstrate that 
// type casting is needed everytime in Non-Generic 

import java.util.*; 

class Test { 
    public static void main(String[] args) 
    { 
        // Creating an ArrayList without any type specified 
        ArrayList al = new ArrayList(); 

        al.add("Sachin"); 
        al.add("Rahul"); 

        // For every retrieval, 
        // it needs to be casted to String for use 
        String s1 = (String)al.get(0); 
        String s2 = (String)al.get(1); 
    } 
}

泛型如何解决此问题:如果将此列表设为泛型,则它将仅使用String对象,并且在检索时仅返回String对象。 因此,将不需要单独的类型转换。

// A Simple Java program to demonstrate that 
// type casting is not needed in Generic 

import java.util.*; 

class Test { 
    public static void main(String[] args) 
    { 
        // Creating an ArrayList with String specified 
        ArrayList<String> al = new ArrayList<String>(); 

        al.add("One"); 
        al.add("Two"); 

        // Retrieval can be easily 
        // without the trouble of casting 
        String s1 = al.get(0); 
        String s2 = al.get(1); 
    } 
}

实现泛型算法:通过使用泛型,人们可以实现适用于不同类型对象的算法,并且它们同样是类型安全的。

泛型和非泛型的区别对比表如下:

比较项 非一般集合 一般集合
语法 ArrayList list = new ArrayList(); ArrayList list = new ArrayList();
类型安全 可以保存任何类型的数据。 因此不是类型安全的。 只能保存定义的数据类型。 因此输入安全。
类型转换 每次检索都需要进行个体类型转换。 无需类型转换。
编译时检查 在运行时检查类型安全。 在编译时检查类型安全性。
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果。
转载请注明:文章转载自 有区别网 [http://www.hasdiffer.com]
本文标题:Java非泛型与泛型集合的区别
本文链接:http://www.vsdiffer.com/non-generic-vs-generic-collection-in-java.html
免责声明:本站部分内容除注明转载外,均为本站网站用户投稿或互联网整理。对于该内容的正确性如何,本站不负任何责任。同时,如本网站内容无意之中冒犯了您的权益,请联系站长,邮箱:1478761107#qq.com(使用@代替#),我们核实并会尽快处理。

相关主题

随机