我正在为自己的论文进行项目研究,无法解决以下问题……在某些情况下,我有几种实现接口并扩展抽象类(实现接口的某些部分)的方法。MFModel是一个包装器类,它封装了我的数据模型和一些对数据流进行某些操作所需的功能。class MFModel<D extends IDataModel<?, ?>> { public MFModel() {} public MFModel(final D dataModel, final IPredictor<D> predictor, final ILearner learner) {}}RecDataModel是我的数据模型实现之一。class RecDataModel implements IDataModel<Map<Long, Map<Long, Double>>, IDataStats> {}BaselinePredictor是提供对模型数据进行操作的功能之一,NullLearner也是如此。class BaselinePredictor extends AbstractModularFunction<IPredictor<IDataModel<?, IDataStats>>> implements IPredictor<IDataModel<?, IDataStats>> {}class NullLearner implements ILearner {}AbstractModularFunction<T>是接口的抽象部分实现。abstract class AbstractModularFunction<T> implements IModularFunction<T> {}以下接口定义了我模型的数据内容,并为我的函数提供了可用的功能:interface IDataModel<T, S> {}interface IDataStats {}interface IPredictor<D> extends IModularFunction<IPredictor<D>> {}interface ILearner extends IModularFunction<ILearner> {}interface IModularFunction<T> {}在尝试实例化新的MFModel时,我遇到了以下问题:首先,如果实例化ILearner和IPredictor<?>的实现版本,则不会收到任何警告或错误:MFModel<?> okayModel = new MFModel<>(new RecDataModel(), new BaselinePredictor(), new NullLearner());但是,如果我尝试使用这些接口,则Eclipse会引发cannot infer type arguments for MFModel<>错误:ILearner learnerFunc = new NullLearner();IPredictor<?> predictorFunc = new BaselinePredictor();MFModel<?> problemModel = new MFModel<>(new RecDataModel(), predictorFunc, learnerFunc); 无法推断MFModel 的类型参数如果省略了菱形运算符,我可以编译并运行代码,这反过来又给我原始类型警告:MFModel<?> warnModel = new MFModel(new RecDataModel(), predictorFunc, learnerFunc); 类型安全:构造函数MFModel(IDataModel,IPredictor,ILearner)属于原始类型MFModel。泛型类型MFModel的引用应为 参数化由于我不喜欢抑制警告(或以后接受可能的错误),因此我想知道类型实参错误的来源。这是一个显示我问题的可运行代码段:http://ideone.com/K5BaIN我非常感谢您可以提供的任何输入,因为我必须承认,这些嵌套的泛型对于我来说很难掌握。它们降低了所需的强制转换和包装器代码的数量,这就是为什么我要保留它们。另外,在某些情况下,由于模块化代码部分的原因,我无法确定我将获得哪种对象,而模块化代码部分可以并且应该很容易地将它们交换为不同的实现。 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 1.切勿使用原始类型出于兼容性原因允许使用它们,但是使用它们首先会破坏使用泛型的目的,因为它们违反了使用泛型实现的几乎所有安全性和抽象性。2.仅在需要时使用通配符通配符表示类型变量的存在量化,因此它们具有特殊目的。不应使用它们来避免必须编写(和考虑)具体类型。如果您不想编写类型,则可能会更喜欢使用动态键入的语言。考虑更换IPredictor<?> predictorFunc = new BaselinePredictor();以下两个语句之一。BaselinePredictor predictorFunc = new BaselinePredictor();IPredictor<IDataModel<?, IDataStats>> predictorFunc = new BaselinePredictor();甚至MFModel<?> okayModel = ...当您尝试使用okayModel时会引起问题。3.类型推断不是魔术编译器使用其他表达式的类型来推断某些表达式的类型。如果您拒绝提供任何具体的类型,则类型推断将变得不可能。在以下代码中,ILearner learnerFunc = new NullLearner();IPredictor<?> predictorFunc = new BaselinePredictor();MFModel<?> problemModel = new MFModel<>(new RecDataModel(), predictorFunc, learnerFunc);您拒绝为编译器提供predictorFunc变量的具体类型参数。您拒绝为编译器提供MFModel构造函数的具体类型参数。您拒绝为编译器提供problemModel变量的具体类型参数。因此,以下错误是合理的。 无法推断MFModel 的类型参数希望这可以帮助。祝好运。 (adsbygoogle = window.adsbygoogle || []).push({}); 09-04 15:13