目前我正在学习通用编程。我不明白为什么Generic Born。当我们有Object Class(data Type)
时。
在代码下方,我已经通过了functioF1
和function21
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());
}
}
答案 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());
}
}