我是java的新手(来自Actionscript 3.0背景),我正在尝试将一些actionscript代码移植到java(as3signals到jsignal)
我正在尝试获取泛型类的类名,以便将其传递给超级调用。
在Actionscript 3.0中,这将是
super(Vector.<TileVO>,Boolean);
上面的代码会将类引用传递给Vector of TileVO和Boolean的构造函数。
在Java中,这似乎不起作用,我知道我做错了什么:
super(ASVector.class<TileVO>,boolean.class);
简而言之,如何获得由TileVO对象组成的ASVector类的类引用?
谢谢!
稍后编辑:
我刚刚意识到代码没有正确显示(被视为html)
发布一些源代码:
public Signal(Class<?>... params) {
this.params = params;
}
我需要通过构造函数传递给Signal类引用。
new Signal(int.class)
例如有效
我需要知道如何向Signal的构造函数传递此形式的对象的类:
ASVector<TileVO>
我尝试了ASVector.class<TileVO>
,似乎无法正常工作!
答案 0 :(得分:1)
不幸的是,在Java中访问ASVector<TileVO>
是不可能的。在Java中,ASVector
与TileVO
没有实际的类实现。查看Java泛型wiki:
Java泛型与C ++模板不同。无论使用的参数化类型的数量如何,Java泛型都只生成泛型类或函数的一个编译版本。
你可以做更具体的事情来解决这个问题:
public static class ASVector_TileVO extends ASVector< TileVO >
{
public ASVector_TileVO( ASVector< TileVO > objects )
{
super( objects );
}
};
现在ASVector_TileVO
是一个基类,可以使用ASVector_TileVO.class
访问。
答案 1 :(得分:1)
在编译时,您的案例中的泛型类型参数<TileVO>
经历“擦除”;编译器将它们的一些用法转换为隐式转换,但在字节码中丢弃有关它们的信息。这意味着对于您的API,ASVector<TileVO>
没有特定的类型,运行时类型只是ASVector
,因此您传入ASVector.class
。如果运行时处理程序必须知道ASVector
的内容是TileVO
个对象,那么您还需要在varargs中的某个位置传入TileVO.class
作为参数。