java泛型方法内怎么生成一个泛型的实例?java泛型意义何在?

泛型是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中的泛型只有在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息檫出,并且在对象和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行阶段。

举个例子:在利用泛型声明一个集合之后,例如Listlist = new ArrayList();在进行list.add(1);时就会提示:The method add(int, String) in the type Listis not applicable for the arguments (int),此时仍处于编译阶段。

并且泛型可以消除源代码中的许多强制类型转换,这样可以使代码更加可读,并减少出错的机会。最后大家如果想要了解更多java实例知识,敬请关注奇Q工具网。

推荐阅读:

java怎么制作时钟?java时钟实例

java语言能做什么?原来能做这些!

java中index是什么意思?java中“index=-1”怎么理解?

推荐内容