这是我正在处理的对象模型的简化版本。
public class GenericsTest {
public interface FooInterface {
public void foo();
}
public class Bar implements FooInterface {
public void foo() {}
}
public interface GenericInterface <T> {
public T func1();
}
public class Service implements GenericInterface<Bar> {
@Override
public Bar func1() {
return null;
}
}
public class GenericBar <S extends GenericInterface<FooInterface>> {
public S s;
public GenericBar() {}
}
public static void main(String[] args) {
GenericBar<Service> serviceGenericBar; // <-- compilation error at this line
<... more code ...>
}
}
编译器错误:type argument GenericsTest.Service is not within bounds of type-variable S
IDE(intellij)显示有关错误的更多详细信息:Type parameter 'GenericsTest.Service' is not within its bound; should implement GenericsTest.GenericInterface<GenericTests.FooInterface>
Service
类正在实现GenericInterface。我已经查看了其他一些具有相同错误的其他SO问题,但它们没有为此特定方案提供线索。关于如何解决这个问题的任何想法?
答案 0 :(得分:2)
问题正是两个编译器告诉你的:类型Service
不在GenericBar
类型要求其类型参数S
的范围内。具体而言,GenericBar
要求将其实现的S
参数绑定到扩展GenericInterface<FooInterface>
的类型。 Service
不满足该要求。
Service
实现了GenericInterface<Bar>
,它既不是GenericInterface<FooInterface>
也不是该类型的扩展,尽管Bar
实现了FooInterface
这一事实。出于基本相同的原因,您也无法将List<String>
分配给List<Object>
类型的变量。
您可以通过修改类GenericBar
的定义来解决编译错误,如下所示:
public class GenericBar <S extends GenericInterface<? extends FooInterface>> {
public S s;
public GenericBar() {}
}
这是否是您实际想要使用的是一个完全不同的问题,只有您可以回答。
答案 1 :(得分:0)
当您更改Service以实现GenericInterface时,代码将被编译。
pointer2 = pointer + 2
或者,如果您希望将Service限制为仅基于Bar,则可以更改GenericBar,以使其更通用:
public class Service implements GenericInterface<FooInterface> {
@Override
public Bar func1() {
return null;
}
}