创建与参数化类型相同的类的对象

时间:2014-06-03 11:27:25

标签: java generics parameterized-types

以下是代码:

package Fabrika.Trake;
import Vozila.*;

public class Traka<T extends Vozilo> extends Thread
{
    protected int vrijemeRada;
    ...

    @Override
    public void run()
    {
        while(true)
        {
            //I want to create the object here
        }
    }
}

现在,假设我有一个名为 Auto 的类,它扩展了 Vozilo

我想知道是否有一种方法可以在不使用反射的情况下构建 T 类型的对象。类似的东西:

T object = new T(); 

这当然是完全错误的,但它只是说明了我想做的事情。 :)

3 个答案:

答案 0 :(得分:2)

使用type token

public class Traka<T extends Vozilo> extends Thread
{
    private Class<T> type;
    protected int vrijemeRada;
    ...

    public Traka(Class<T> type) {
        this.type = type;
   }

    @Override
    public void run()
    {
        while(true)
        {
            //I want to create the object here
            T object = type.newInstance();
        }
    }
}

这当然有效 - 只有具有已知数量参数的构造函数。我的例子使用了无参数构造函数。

并且:不要延长Thread!而是实施Runnable。然后在任何需要的地方使用那些runnable。

答案 1 :(得分:1)

仅使用通用类型T无法执行此操作。

要创建实例,您需要Class个实例。

E.g:

public class Traka<T extends Vozilo> extends Thread
{
    protected int vrijemeRada;
    ...

    private Class<T> type;

    public Traka(Class<T> type) {
        this.type = type;
    }

    @Override
    public void run()
    {
        while(true)
        {
            T newInstance = type.newInstace(); // this uses the default constructor
        }
    }
}

用法:

Traka<Auto> autoTraka = new Traka(Auto.class);

问题是泛型类型信息T在运行时被擦除。因此,您需要一个Class实例来表示运行时的类型。

答案 2 :(得分:1)

有一个特殊模式:将Class实例传递给Traka的构造函数,将其存储在私有变量中,并使用该类来实例化新对象,如下所示:

public class Traka<T extends Vozilo> extends Thread {
    private Class<T> theClass;
    public Traka(Class<T> theClass) {
        this.theClass = theClass;
    }
    ...
    @Override
    public void run() {
        while(true) {
            T inst = theClass.newInstance();
        }
    }
}

注意:如果您想知道为什么Class在Java 5中被参数化,那么上面的模式就是答案。