为什么我无法传递此泛型类的某个参数?

时间:2015-11-29 02:19:00

标签: java generics

我有一个通用类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()中的编译器报告&#34; Parameter无法应用于(构造函数)。具体来说,它抱怨type论证。

我所展示的表包括:

Expected Arguments                 | Actual Arguments                
--------------------------------------------------------------------
type: package.ParameterTypeBoolean | type: new ParameterTypeBoolean() (path)

我不知道该怎么做,或者如何解决这个问题。

在某处可能存在逻辑错误吗?

我在Oracle上引用了有关此问题的以下文章,但我无法诊断该问题:Type InferenceGeneric Types

2 个答案:

答案 0 :(得分:3)

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

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

T类型应为Boolean,而不是ParameterTypeBoolean

如果你这样做

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

没有编译问题。 http://square.github.io/picasso/

答案 1 :(得分:2)

您的ParameterTypeBoolean有效实施ParameterType<Boolean>

Parameter的构造函数要求第一个参数为ParameterType<T>类型。这意味着在这种情况下TBoolean。调用构造函数的正确方法是:

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