我有一个通用类Parameter<T>

@Data
public class Parameter<T> {
    private ParameterType<T> type;
    private String name;
    private String description;
    private boolean required = true;

    public Parameter(ParameterType<T> type, String name, String description, boolean required) {
        this.type = type;
        this.name = name;
        this.description = description;
        this.required = required;
    }
}


@Data批注在编译时生成getter(以及用于非final字段的setter)。 (请参见project lombok。)

注意,第一个字段是另一个通用类ParameterType<T>,但是它是一个接口:

public interface ParameterType<T> {
    String getParameterTypeName();
    T read(String arg) throws Exception;
    boolean isValid(String arg, CommandSender sender);
    String getError();
}


此接口由AbstractParameterType<T>实现,该接口为以下方法提供了基本实现:[getParameterTypeName()isValid()getError()。]因此,除非有要求,否则在这里将没有该代码。

上述课程仅供参考。

我遇到的问题是我无法在外部类中实例化新的Parameter

我正在尝试以下代码:

(new Parameter<ParameterTypeBoolean>(new ParameterTypeBoolean(), "", "", false));


其中ParameterTypeBooleanAbstractParameterType<Boolean>的实现,而构造函数是Parameter<T>中看到的构造函数。

编译器报告“ Parameter()中的Parameter无法应用于(构造函数)。特别是,它抱怨type参数。

显示的表格包括:

预期参数实际参数
-------------------------------------------------- ------------------
类型:package.ParameterTypeBoolean |类型:new ParameterTypeBoolean()(路径)


我不确定该怎么做,或如何解决此问题。

也许某个地方存在逻辑错误?

我已经参考了有关此问题的有关Oracle的以下文章,但是我无法诊断该问题:Type InferenceGeneric Types

最佳答案

ParameterTypeBoolean实现ParameterType<Boolean>。因此,如果要将ParameterTypeBoolean的实例传递给构造函数

public Parameter(ParameterType<T> type, String name, String description, boolean required)


类型T应该是Boolean,而不是ParameterTypeBoolean

如果你这样做

new Parameter<Boolean>(new ParameterTypeBoolean(), "", "", false);


没有编译问题。 Here is the proof

10-08 11:43