【问题标题】:Java allocation of objects within generic functions workaround? [duplicate]泛型函数中对象的Java分配解决方法? [复制]
【发布时间】:2013-06-19 20:25:10
【问题描述】:

基本上我要做的是从泛型函数中分配一个参数化类型:

public < T > T wishful_thinking(  )
{
    return new T( );
}

由于“对象切片”(也就是说,它可以编译,但是“segfaults”),转换也不起作用:

public < T > T wishful_thinking(  )
{
    return ( T )new Object( );
}

那么...有什么解决方法(可能使用反射或类似的方法)?

谢谢!

【问题讨论】:

  • 我认为你的意思是它会抛出一个与 SEG 错误非常不同的 ClassCastError。
  • @Peter Lawrey:是的,我只是在使用普通的编程语言(因此是引号)。
  • 顺便说一句,您可以在 JVM 中获得 SEG 错误,但只有非常低级别的崩溃。

标签: java


【解决方案1】:

你不能。解决方案是在你的方法中传递一个Class 对象,并使用反射来创建一个实例。

没有任何异常处理的例子:

public <T> T wishful_thinking(Class<T> clazz)
{
    return clazz.newInstance();
}

【讨论】:

  • Grrr...必须有某种方法可以做到这一点。真的很有趣,Java 泛型是一种编译时(相对于运行时)工具,但它甚至不考虑这样的基本操作!
  • Enums/EnumSets 很有趣,因为它们是少数遇到此问题的 java 标准类之一。
  • @SeaBass 如果调用者不能分配它,那么调用层次结构中较低的函数就不可能管理它。例如,如果调用者传递了一个抽象类或接口。
【解决方案2】:

Java 中没有具体化泛型。因此,您不能拥有像 new T() 这样的东西,因为 T 已被删除。

获取对象的唯一方法是使用Class 表示:

public <T> T wishful_thinking( Class<T> classToInstanciate ) throws ...
{
   return classToInstanciate.newInstance();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 2018-02-07
    相关资源
    最近更新 更多