泛型是JDK1.5新加入的,解决数据类型的安全性问题,有了它可以更加方便开发人员的开发,提升程序的准确性,那java泛型方法内怎么生成一个泛型的实例?下面来我们就来给大家讲解一下。
因为泛型的擦除,所以任何在运行时需要知道确切类型信息的操作都将无法工作。
public class Erased { private final int SIZE = 100; public static void f(Object arg) { if (arg instanceof T) {} //错误 T var = new T(); //错误 T[] array = new T[SIZE]; //错误 T[] array = (T) new Object[SIZE]; //警告 } }
引入类型标签,使用动态的isInstance():
class Building {} class House extends Building {} public class ClassTypeCapture { Classkind; public ClassTypeCapture(Classkind) { this.kind = kind; } public boolean f(Object obj) { return kind.isInstance(obj); } public static void main(String[] args) { ClassTypeCapturectt1 = new ClassTypeCapture(Building.class); System.out.println(ctt1.f(new Building())); System.out.println(ctt1.f(new House())); } }
创建类型实例:
new T()无法实现,部分原因是因为擦除,而另一部分原因是因为编译器不能验证T是否具有默认构造器。
1.传递一个工厂对象,并使用它来创建新的实例。
class ClassAsFactory { T x; public ClassAsFactory(Classkind) { try { x = kind.newInstance(); } catch (Exception e) { throw new RuntimeException(e); } } } class Employee {} public class InstantiateGenericType { public static void main(String[] args) { ClassAsFactoryfe = new ClassAsFactory(Employee.class); System.out.println("ClassAsFactorysucceeded"); try { ClassAsFactoryfi = new ClassAsFactory(Integer.class); } catch (Exception e) { System.out.println("ClassAsFactoryfailed"); } } } /** * 因为Integer没有默认的构造函数,所以ClassAsFactory会失败 * 因为这个错误不是编译期捕获的,所以并不赞成使用这种方法,建议使用显式 * 的工厂,并将其限制类型,使得只能接受实现了这个工厂的类。 */
2.显式工厂
class Foo2 { private T x; //F为工厂 public < f factory > Foo2(F factory) { x = factory.create(); } } //普通类,实现工厂接口 class IntegerFactory implements Factory { public Integer create() { return new Integer(0); } } class Widget { //静态内部类,实现工厂接口 public static class Factory implements fanxing.Factory { public Widget create() { return new Widget(); } } } public class FactoryConstraint { public static void main(String[] args) { new Foo2(new IntegerFactory()); new Foo2(new Widget.Factory()); } }
3.模板方法设计模式
//模板类 abstract class GenericWithCreate { final T element; GenericWithCreate() { element = create(); } //create()交由具体要实例化的子类实现 abstract T create(); } class X {} class Creator extends GenericWithCreate { X create() { return new X(); } void f() { System.out.println(element.getClass() .getSimpleName()); } } public class CreateorGeneric { public static void main(String[] args) { Creator c = new Creator(); c.create(); } }
java泛型意义何在?
java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁、健壮。
java中的泛型只有在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息檫出,并且在对象和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行阶段。
举个例子:在利用泛型声明一个集合之后,例如List
并且泛型可以消除源代码中的许多强制类型转换,这样可以使代码更加可读,并减少出错的机会。最后大家如果想要了解更多java实例知识,敬请关注奇Q工具网。
推荐阅读: