编译泛型类型的时间错误

时间:2014-08-25 13:16:19

标签: java eclipse ant javac

通常,在eclipse中,我可以运行我的代码而不会出现任何编译错误。但是,使用ant文件,我遇到了error: type argument Map is not within bounds of type-variable Type。我的ant文件出了什么问题?

我犯的代码错误;

[javac] class StratI implements Strat<Map> {
[javac]                                      ^
[javac]   where T is a type-variable:
[javac]     T extends Map<?,?> declared in interface Strat
[javac] 1 error

Ant - javac部分;

<target name="compile"  depends="init">
        <javac  compiler="javac1.7"
                destdir="${build.dir}/classes"
                source="1.7"
                target="1.7"
                includeantruntime="false"
                encoding="ISO-8859-1">

                <src    path="${src.dir}" />
                <classpath refid="classpath" />
        </javac>
</target>

注意:我在谷歌搜索此错误。我没有看到任何说明真正原因的来源,并说明如何解决它。

3 个答案:

答案 0 :(得分:0)

您的班级Strat显然已经开始

class Strat implements Strat<Map>

显然你不能拥有一个实现自己的类(因为它是一个接口;看起来你有一个名字冲突)。此外,如果它没有被声明为具有参数,则它不是通用的。

由于您在不同的软件包中有一个通用接口(根据您的评论,是,它位于不同的软件包中),您可以明确地将完整软件包用于接口 - 例如,

package com.example.interface;

// A generic Strat interface
interface Strat<T> {
}

然后实现它(你应该选择一个更具描述性的名字 - 也许是IStrat<T>) -

package com.example.impl;

class Strat implements com.example.interface.Strat<Map> {
}

或使用IStrat

class Strat implements IStrat<Map> {
}

答案 1 :(得分:0)

地图是raw-type,并且如错误中所述,is not within bounds of type-variable TypeT extends Map<?,?>。尽管你正在扩展一个“拿任何东西”的地图,它仍然是原始类型的规范。

您应该在:

中更改StratI接口实现的声明
class StratI implements Strat<Map<?,?>>

或者你正在扩展

class StratI implements Strat<HashMap<?,?>>

或者因为它是一个实现

class StratI implements Strat<HashMap<Integer, String>>

修改

Eclipse没有将其显示为错误的事实是Eclipse不显示非参数化原始类型的编译错误。它会显示警告:

public interface myIn<T extends Map<?,?>>{
   void foo();
}

public class myClass implements myIn<Map>{
 @Override
 public void foo() {}

}

Eclipse会在警告中强调Map

  

Map是原始类型。对泛型类型Map<K,V>的引用应该是   参数

答案 2 :(得分:0)

您定义界面的方式是错误的。请查看java文档。 下面的代码将有所帮助。

public interface Start<T> {
    public void display();
}

public class StartI implements Start<Map<String, String>> {

    @Override
    public void display() {
        System.out.println("Implement here");
    }

}