有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java:Generics:尝试在参数中包含genrics的接口中实现定义的方法时发生编译错误

我正在尝试使用setter方法编写一个接口,该方法将树映射作为参数

该树映射可以具有从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");
    }

}

编译错误是:

The method setFrameDataMap(TreeMap.AbstractFrameData>) of type WaveSatDataLoader must override or implement a supertype method

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

我不明白为什么编译器在抱怨

任何帮助都将不胜感激

谢谢


共 (1) 个答案

  1. # 1 楼答案

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

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

    AbstractNResource<AbstractNRequestableResourceData, INDescriptor>.AbstractFrameData
    

    而在WaveSatDataLoader中它是

    AbstractNatlCntrsResource<WaveSatResourceData, NCMapDescriptor>.AbstractFrameData
    

    我还对IDataLoader是否应该是泛型感到困惑。你已经写信了

    implements IDataLoader<AbstractNatlCntrsRequestableResourceData, INatlCntrsDescriptor> 
    

    但是在代码的第一部分IDataLoader没有类型参数