以下是代码:
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();
这当然是完全错误的,但它只是说明了我想做的事情。 :)
答案 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中被参数化,那么上面的模式就是答案。