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

问题描述 投票:-3回答:1

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

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");

但为什么?

java generics constructor builder
1个回答
1
投票

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

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");
© www.soinside.com 2019 - 2024. All rights reserved.