我有一个通用类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));
其中ParameterTypeBoolean
是AbstractParameterType<Boolean>
的实现,构造函数是Parameter<T>
中的构造函数。
Parameter()
中的编译器报告&#34; Parameter
无法应用于(构造函数)。具体来说,它抱怨type
论证。
我所展示的表包括:
Expected Arguments | Actual Arguments -------------------------------------------------------------------- type: package.ParameterTypeBoolean | type: new ParameterTypeBoolean() (path)
我不知道该怎么做,或者如何解决这个问题。
在某处可能存在逻辑错误吗?
我在Oracle上引用了有关此问题的以下文章,但我无法诊断该问题:Type Inference和Generic Types。
答案 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>
类型。这意味着在这种情况下T
为Boolean
。调用构造函数的正确方法是:
new Parameter<Boolean>(new ParameterTypeBoolean(), "", "", false);