泛型函数中对象的Java分配解决方法? [复制]

Posted

技术标签:

【中文标题】泛型函数中对象的Java分配解决方法? [复制]【英文标题】:Java allocation of objects within generic functions workaround? [duplicate] 【发布时间】: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 错误,但只有非常低级别的崩溃。 【参考方案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();

【讨论】:

以上是关于泛型函数中对象的Java分配解决方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

涉及泛型对象的泛型属性的赋值无法在泛型函数中正确进行类型检查

javapoet添加泛型参数问题,怎么解决

Java高级 —— 泛型

如何使用给定的 Type 对象调用泛型方法? [复制]

201671010130 2016-2017-2 《Java程序设计》第十周学习小结

在Java中实例化一个泛型类[重复]