我试图扩展 Apache Flink 中具有以下签名的 org.apache.flink.api.common.io.FileInputFormat
类
public abstract class FileInputFormat<OT> extends RichInputFormat<OT, FileInputSplit> {}
为了完整起见,RichInputFormat
类的签名是,
public abstract class RichInputFormat<OT, T extends InputSplit> implements InputFormat<OT, T> {}
它(第一个类 - FileInputFormat
)有两个抽象方法 public booleanreachEnd()
和 public OT nextRecord(OTreuse)
现在,如果我将类型扩展为,
public class MyInputFormat<T> extends FileInputFormat<T>{}
然后,IntelliJ 正如预期的那样,建议(Ctrl+I)实现这两个抽象方法,这是正确的,也是编译程序所需要的。
但是,如果我将不类型扩展为,
public class MyInputFormat extends FileInputFormat{}
然后 IntelliJ 建议在 InputFormat
接口(interface)中实现另外两个方法,这两个方法已在 FileInputFormat
类中实现。这些方法是 public InputSplitAssigner getInputSplitAssigner(InputSplit[] inputSplits)
和 public void open(InputSplit split)
。
事实上,这些对于编译程序来说并不是必需的,尽管人们可能更愿意覆盖它们。
这种行为有什么逻辑推理吗?
最佳答案
我认为这是IntelliJ的一个特点。建议的两个附加方法取决于 super 接口(interface)“InputFormat”中定义的一些通用参数。
显然,当泛型类型被删除时,IntelliJ 假定应该重写其他方法。
这看起来几乎像一个小错误:在 Java 中使用原始类型时,类型参数应默认为其下限(此处“Object”代表“T”)。 但在这种情况下,“FileInputFormat”(即“FileInputSlit”)的定义参数也被删除。
关于java - 在 IntelliJ IDEA 中扩展具有和不具有类型的泛型类会给出不同的实现方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35344806/