通用类型与对象和外卡之间的区别

时间:2015-08-14 05:40:47

标签: java generics

目前我正在学习通用编程。我不明白为什么Generic Born。当我们有Object Class(data Type)时。 在代码下方,我已经通过了functioF1function21  HashCodeclass1作为参数。两者都需要将传递的参数强制转换为特定的Class,并且操作的输出将是相同的。然后为什么Generic进入图片?

package know.generic;

import knowl.collection.hashcodeInternal.HashCodeclass1;

public class ClassGeneric {
    public <T> void functioF1(T arg) {
        System.out.println(arg.getClass().getName());
        System.out.println("val1 " + arg);
        HashCodeclass1 hCC = (HashCodeclass1) arg;
    }

    public void functioF21(Object arg) {
        System.out.println(arg.getClass().getName());
        System.out.println("val2 " + arg);
        HashCodeclass1 hCC = (HashCodeclass1) arg;
    }
}

public class TestGeneric {
    public static void main(String arg[]) {
        ClassGeneric cg = new ClassGeneric();
        cg.functioF1(new HashCodeclass1());
        cg.functioF21(new HashCodeclass1());
    }
}

2 个答案:

答案 0 :(得分:1)

请参阅javadocs。 网站上的一些相关文字: -

  

使用泛型的代码比非泛型代码有许多好处:

     

1.在编译时进行更强的类型检查。   Java编译器将强类型检查应用于通用代码,并在代码违反类型安全性时发出错误。修复编译时错误比修复运行时错误更容易,这很难找到。

     

2.消除演员阵容。   以下没有泛型的代码片段需要强制转换:   List list = new ArrayList();   list.add(&#34;你好&#34);   String s =(String)list.get(0);   重写以使用泛型时,代码不需要转换:   List list = new ArrayList();   list.add(&#34;你好&#34);   String s = list.get(0); //没有演员

     

3.使程序员能够实现通用算法。   通过使用泛型,程序员可以实现泛型算法,这些算法可以处理不同类型的集合,可以自定义,并且类型安全且易于阅读。

如果您的集合通过多个类传递,则删除强制类型和类型非常重要。它避免了意外的类转换问题,并提供了更好的可维护性。

答案 1 :(得分:0)

您可以参考javadocs @Panther 也指出相同。

您还可以参考HashMap的源代码。并且还想想如果你不使用泛型来重写这段代码,那么你将使用泛型来克服哪些挑战?

我只是在改写你的代码。你可以检查一下这个优势。

public class ClassGeneric {
    public <T> T functioF1(T arg) { // changed return type from void
        System.out.println(arg.getClass().getName());
        System.out.println("val1 " + arg);
        // HashCodeclass1 hCC = (HashCodeclass1) arg;
        return arg; 
    }

    public Object functioF21(Object arg) { // changed return type from void
        System.out.println(arg.getClass().getName());
        System.out.println("val2 " + arg);
        // HashCodeclass1 hCC = (HashCodeclass1) arg;
        return arg;
    }
}

public class TestGeneric {
    public static void main(String arg[]) {
        ClassGeneric cg = new ClassGeneric();

        //no casting required and compile time check of type
        HashCodeclass1 f1OutputObj = cg.functioF1(new HashCodeclass1());

        // you need to use casting
        HashCodeclass1 f2OutputObj = (HashCodeclass1) cg.functioF21(new HashCodeclass1());
    }
}