我有一个通用类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()
中的Parameter
无法应用于(构造函数)。特别是,它抱怨type
参数。显示的表格包括:
预期参数实际参数
-------------------------------------------------- ------------------
类型:package.ParameterTypeBoolean |类型:new ParameterTypeBoolean()(路径)
我不确定该怎么做,或如何解决此问题。
也许某个地方存在逻辑错误?
我已经参考了有关此问题的有关Oracle的以下文章,但是我无法诊断该问题:Type Inference和Generic 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。