gpt4 book ai didi

java - 无法实例化类型 T

转载 作者:可可西里 更新时间:2023-11-01 15:57:58 25 4
gpt4 key购买 nike

我有一个看起来像这样的类......

public class LegionInputFormat
extends FileInputFormat<NullWritable, LegionRecord> {

@Override
public RecordReader<NullWritable, LegionRecord>
createRecordReader(InputSplit split, TaskAttemptContext context) {

/* Skipped code for getting recordDelimiterBytes */

return new LegionRecordReader(recordDelimiterBytes);
}
}

我想使用泛型,这样它就可以返回用户指定的任何类型的 RecordReader,如下所示:

public class LegionInputFormat<T extends RecordReader<NullWritable, LegionRecord>>
extends FileInputFormat<NullWritable, LegionRecord> {

@Override
public RecordReader<NullWritable, LegionRecord>
createRecordReader(InputSplit split, TaskAttemptContext context) {

/* Skipped code for getting recordDelimiterBytes */

return new T(recordDelimiterBytes);
}
}

如帖子标题所示,有人告诉我“无法实例化 T 型”。从其他 Stack Exchange 帖子中,我了解到由于泛型的工作原理,这是不可能的。我无法收集到的是对为什么会这样的直观解释。我通过理解学习得最好,所以如果有人能提供它,那将非常有帮助。

我还对完成我在这里想要做的事情的最佳实践感兴趣。 LegionInputFormat 的构造函数是否应该接受一个 RecordReader 类,存储它,然后稍后引用它来创建一个新实例?或者有更好的解决方案吗?

(其他背景 - 这里的上下文是 Hadoop,但我怀疑它是否重要。我是一个相当有成就的数据科学家,但我对 Java 还很陌生。)

最佳答案

As the post title suggests, I'm being told I "cannot instantiate the Type T." From other Stack Exchange posts, I've gathered that this is not possible due to something with how generics work.

这是因为 Java 中的泛型纯粹是一个编译时特性;编译器丢弃了泛型(这称为“type erasure”),因此在运行时,没有类型变量 T 这样的东西。 , 所以你不能做 new T(...) .

您可以通过传递一个 Class<T> 在 Java 中执行此操作对象指向需要创建 T 实例的方法, 然后通过 reflection 创建一个实例.

关于java - 无法实例化类型 T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41121705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com