Java:使用具有泛型构造函数的构建模式时“无法解析方法”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java:使用具有泛型构造函数的构建模式时“无法解析方法”相关的知识,希望对你有一定的参考价值。

我有一个带有构造函数和构建器方法的泛型类:

public class FilterBuilder<T> {
    public FilterBuilder() {

    }

    public FilterBuilder<T> add(T x) {
        ...
        return this;
    }
}

我实例化,但添加无法从构造函数调用:

FilterBuilder<String> filter = new FilterBuilder().add("test");

这给了Intellij中的“无法解决方法添加”错误。我必须这样做才能使它工作:

FilterBuilder<String> filter = new FilterBuilder();
filter.add("test");

但为什么?

答案

使用您的实际代码,我认为当您指定钻石运算符<>时会出现问题:

FilterBuilder<String> filter = new FilterBuilder<>().add("test");

原始类型不应生成编译错误,而应生成警告,但是如果您的IDE配置在此问题上更严格。

这是IDE特有的编译错误,因为他们将new FilterBuilder<>()视为原始类型,即使声明的构建器的类型是<String>

通过使用javac进行编译,在Eclipse Oxygen上没有编译错误,我有问题。

我怀疑在IDE中没有实现钻石操作符支持,以允许将实例化链接到实例方法调用。

作为解决方法,你可以做两次事情:

FilterBuilder<String> filter = new FilterBuilder<>();
filter.add("test");

或指定通用两次:

FilterBuilder<String> filter = new FilterBuilder<String>().add("test");

以上是关于Java:使用具有泛型构造函数的构建模式时“无法解析方法”的主要内容,如果未能解决你的问题,请参考以下文章

使用 Class 对象创建通用二维数组

具有高阶函数的泛型

Java泛型方法和构造函数

Swift参数及泛型参数参考!

Java数据结构手写泛型数组

Java数据结构手写泛型数组