Java:创建一个对象,其类型为类型参数

穆罕默德·阿塔什(MehmetAtaş):

我想编写等效于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#的方式,还是应该使用原型模式和克隆之类的方法?

劳伦斯·麦卡品(Lawrence McAlpin):

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TypeError:第一个参数必须是熊猫对象的可迭代对象,您传递了类型为“ DataFrame”的对象

Java将类型对象的ArrayList转换为另一个类型对象的ArrayList

将类类型存储为变量以标识Java列表中的下一个预期对象类型

为std :: shared_ptr指定一个Deleter,它适用于特定类型或其派生类型的所有对象

创建一个接受类型对象的通用方法并返回一个新的类型对象

Haskell中是否有一个函数返回其参数的类型(或显示该类型的字符串)?

声明一个变量,其键为两种类型的串联

类型为返回值的参数不是第一个参数,或者类型为返回值的参数不止一个

Java:返回与一个JSON对象相同的类型值

创建一个带有枚举参数的类型

创建一个类型,该类型定义包含特定嵌套属性的对象的键

为Haskell中的每个Integer创建一个类型?

如何创建一个类型函数来检查TypeScript中的类型是否为空对象?

只能创建一个类型为cardNumber的元素

为什么要创建一个方法类型对象,我想要一个类型列表对象

最后一个参数位置中类型为T的那些函数的类型

从另一个对象类型创建一个对象

如何用一个类型参数为泛型类型指定两个具体的类型参数?

转换一个泛型类,它是其类型的对象

调用超类型方法会创建一个新的超类型对象吗?

从其基本类型创建一个超级对象(Grails)

人们为什么要声明一个为其分配的对象的基本类型的变量?

Java - 创建一个伪本机类型

构造一个 unordered_map,其值为一对字符串和对象类型

如何链接到类类型创建另一个类类型的对象

是否有可能(还)返回一个输入对象,其类型映射到每个属性?

如何创建一个数组类型的对象?

Laravel 发布请求传递类,其属性为另一个类的类型

如何创建一个名为 isNumber 的函数,该函数接收名为 val 的参数并返回一个布尔值,指示参数是否为 number 类型