我想编写等效于C#代码的Java代码。
我的C#代码如下:
public abstract class A<T> where T : A<T>, new()
{
public static void Process()
{
Process(new T());
}
public static void Process(T t)
{
// Do Something...
}
}
public class B : A<B>
{
}
public class C : A<C>
{
}
Java代码相当于我的代码。
public abstract class A<T extends A<T>>
{
public static <T extends A<T>> void process()
{
process(new T()); // Error: Cannot instantiate the type T
}
public static <T extends A<T>> void process(T t)
{
// Do Something...
}
public class B extends A<B>
{
}
public class C extends A<C>
{
}
}
在此,类声明中的“ new()”语法强制派生类编写默认构造函数,从而可以从基类调用“ new T()”。换句话说,当我编写基类时,我确定派生类将具有默认构造函数,这样我就可以从基类实例化派生类对象。
我在Java中的问题是,我无法实例化超类的派生类对象。我打电话时"Cannot instantiate the type T"
出错"new T()"
。Java中是否有类似C#的方式,还是应该使用原型模式和克隆之类的方法?
Java不支持统一的泛型,因此没有等效于“ new T();
”。解决此问题的方法是对类型标记使用反射。类型标记指示什么是通用类型。
public abstract class A<T> {
private Class<T> typeToken;
// constructor
public A() {
typeToken = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
}
然后使用反射实例化该类。很难看,但是可以完成工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句