通常,在eclipse中,我可以运行代码而不会出现任何编译错误。然而,在ant文件中,我面对的是error: type argument Map is not within bounds of type-variable Type
。我的蚂蚁文件有什么问题?
代码我取错了;
[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>
注意:我已经搜索谷歌这个错误。
您的课程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> {
}
你定义接口的方式是错误的。请阅读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");
}
}
Map是一个raw类型,正如错误中所述,它不在类型变量Type
的范围内,即T extends Map<?,?>
。尽管您扩展了"take whatever"映射,但它仍然是原始类型的规范。
您应该更改StratI
接口实现的声明:
class StratI implements Strat<Map<?,?>>
或者因为你扩展了
class StratI implements Strat<HashMap<?,?>>
或者yet因为它是一个实现
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>
的引用应该是参数化的