【问题标题】:Java: Generics: Compilation Error When Trying to implment a method defined in an Interface with genrics in the argumentJava:泛型:尝试实现在参数中使用泛型的接口中定义的方法时出现编译错误
【发布时间】:2015-10-30 06:45:23
【问题描述】:

我正在尝试使用将 TreeMap 作为参数的 setter 方法编写接口。

TreeMap 可以包含从 AbstractNResource 类派生的类的对象。 AbstractNResource 的类定义是用泛型编写的,以使其接受来自其他两个类层次结构的两个参数。

我在编译器将接受的接口中编写 setter 方法时遇到了麻烦。

这是接口(有编译错误),我称之为IDataLoader:

public interface IDataLoader {

        public abstract void setFrameDataMap(    
            // Compile Error: Syntax error on token "extends", , expected
            TreeMap<Long, AbstractNResource<AbstractNRequestableResourceData, INDescriptor>.AbstractFrameData> frameDataMap);
}    

这是 TreeMap 可以拥有的对象的父类:

public abstract class AbstractNResource<T extends AbstractNRequestableResourceData, D extends INDescriptor>
        extends
        AbstractVizResource<AbstractNRequestableResourceData, IDescriptor>
        implements INResource {

        public abstract class AbstractFrameData {}

        protected TreeMap<Long, AbstractFrameData> frameDataMap;
}

下一步,我有一个 AbstractDataLoader 类,它部分实现了接口 IDataLoader:

public abstract class AbstractDataLoader<T extends AbstractNatlCntrsRequestableResourceData, D extends INatlCntrsDescriptor>
        implements
        IDataLoader<AbstractNatlCntrsRequestableResourceData, INatlCntrsDescriptor> {}

再往下走,我有一个类 WaveSatDataLoader 扩展了该抽象类。这是发生编译错误的地方:

public class WaveSatDataLoader extends
        AbstractDataLoader<WaveSatResourceData, NCMapDescriptor> {

    @Override
    public void setFrameDataMap(TreeMap<Long,AbstractNatlCntrsResource<WaveSatResourceData, NCMapDescriptor>.AbstractFrameData> frameDataMap) {
        System.out.println("To do");
    }

}

编译错误是:

方法 setFrameDataMap(TreeMap.AbstractFrameData>) WaveSatDataLoader 类型的必须覆盖或实现超类型 方法

我在 AbstractDataLoading 类中没有 setFrameDataMap() 实现,但是放在那里没有帮助。

我对编译器抱怨的原因感到困惑。

任何帮助将不胜感激

谢谢

【问题讨论】:

    标签: java generics


    【解决方案1】:

    编译器在抱怨,因为您尝试使用具有不同签名的方法实现接口方法。

    IDataLoader中,setFrameDataMap的参数的第二个类型参数是

    AbstractNResource<AbstractNRequestableResourceData, INDescriptor>.AbstractFrameData
    

    而在WaveSatDataLoader 中是

    AbstractNatlCntrsResource<WaveSatResourceData, NCMapDescriptor>.AbstractFrameData
    

    我也对IDataLoader 是否应该是通用的感到困惑。你写了

    implements IDataLoader<AbstractNatlCntrsRequestableResourceData, INatlCntrsDescriptor> 
    

    然而在代码的第一部分IDataLoader 没有类型参数。

    【讨论】:

    • 嗨,保罗。关于您的第一条评论 WaveSatResourceData 和 NCMapDescriptor 是 AbstractNRequestableResourceData 和 INDescriptor 的子项。我的印象是让孩子代替父母在 Java 中是洁净的。我正在尝试重写接口 IDataLoader 方法来实现它。
    • 嗨,Paul,关于您的第二条评论,我将泛型放在 IDataLoader 的定义中,这样我就可以在那里定义 setFrameData 和 'T' 和 'D' 作为让 IDataLoader 到编译,并最终获得覆盖(用于实现)形式的 setFrameDataMap 以接受 WaveSatResourceData 和 NCMapDescriptor,以及 AbstractNRequestableResourceData 和 INDescriptor 的其他子项
    • 用 child 代替 parent 可以作为返回类型,但不能作为方法参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多