Обычно, в 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
Ант-Джавак;
<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>
Примечание. Я искал Google для этой ошибки. Я не вижу ни одного источника, который говорит правду и показывает, как его решить.
Очевидно, ваш класс 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> {
}
public interface Strat<T extends Map<?,?>>
Strat
вы обращаетесь? В вашем вопросе ясно сказано, что class Strat implements Strat<Map>
, здесь Эллиот ссылается на это.
Карта является сырым типом и, как указано в ошибке, не находится в пределах ограничений типа Type
который является T extends Map<?,?>
. Хотя вы расширяете карту "взять все", она по-прежнему является спецификацией необработанного типа.
Вы должны изменить объявление StratI
интерфейса 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>
должна быть параметризована
То, как вы определили свой интерфейс, неверно. Прочтите 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");
}
}