Java 泛型编译错误:类型参数不在类型变量的范围内

Java 泛型编译错误:类型参数不在类型变量的范围内,java,generics,Java,Generics,这是我正在研究的对象模型的简化版本 public class GenericsTest { public interface FooInterface { public void foo(); } public class Bar implements FooInterface { public void foo() {} } public interface GenericInterface <T> {

这是我正在研究的对象模型的简化版本

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 ...>
    }

}
公共类泛型测试{
公共接口{
公开无效foo();
}
公共类栏实现了一个接口{
公共void foo(){}
}
公共接口通用接口{
公共T函数1();
}
公共类服务实现泛型接口{
@凌驾
公共酒吧1(){
返回null;
}
}
公共类通用条{
公共服务;
公共GenericBar(){}
}
公共静态void main(字符串[]args){

GenericBar服务GenericBar;//当您更改服务以实现GenericInterface时,代码将编译

public class Service implements GenericInterface<FooInterface> {
    @Override
    public Bar func1() {
        return null;
    }
}
公共类服务实现泛型接口{
@凌驾
公共酒吧1(){
返回null;
}
}
或者,如果您希望将服务限制为仅基于Bar,您可以更改GenericBar,使其变得更通用:

public class Service implements GenericInterface<Bar> {
    @Override
    public Bar func1() {
        return null;
    }
}

public class GenericBar<S extends GenericInterface<? extends FooInterface>> {
    public S s;

    public GenericBar() {
    }
} 
公共类服务实现泛型接口{
@凌驾
公共酒吧1(){
返回null;
}
}

公共类GenericBar当您更改服务以实现GenericInterface时,代码将编译

public class Service implements GenericInterface<FooInterface> {
    @Override
    public Bar func1() {
        return null;
    }
}
公共类服务实现泛型接口{
@凌驾
公共酒吧1(){
返回null;
}
}
或者,如果您希望将服务限制为仅基于Bar,您可以更改GenericBar,使其变得更通用:

public class Service implements GenericInterface<Bar> {
    @Override
    public Bar func1() {
        return null;
    }
}

public class GenericBar<S extends GenericInterface<? extends FooInterface>> {
    public S s;

    public GenericBar() {
    }
} 
公共类服务实现泛型接口{
@凌驾
公共酒吧1(){
返回null;
}
}

公共类GenericBar问题正是两个编译器告诉您的:type
Service
不在type
GenericBar
对其类型参数
S
所要求的范围内。具体地说,
GenericBar
要求将其实现的
S
参数绑定到扩展的类型<代码>通用接口
服务
不满足该要求

服务
实现了
通用接口
,它既不是
通用接口
也不是该类型的扩展,
Bar
实现了
FooInterface
。出于基本相同的原因,您也不能将
列表
分配给
列表
类型的变量

您可以通过修改class
GenericBar
的定义来解决编译错误,如下所示:

public class GenericBar <S extends GenericInterface<? extends FooInterface>> {
    public S s;
    public GenericBar() {}
}

public-class-GenericBar问题正是两个编译器告诉您的:type
Service
不在type
GenericBar
对其类型参数
S
所要求的范围内。具体地说,
GenericBar
要求将其实现的
S
参数绑定到趋向于
通用接口
服务
不满足该要求

服务
实现了
通用接口
,它既不是
通用接口
也不是该类型的扩展,
Bar
实现了
FooInterface
。出于基本相同的原因,您也不能将
列表
分配给
列表
类型的变量

您可以通过修改class
GenericBar
的定义来解决编译错误,如下所示:

public class GenericBar <S extends GenericInterface<? extends FooInterface>> {
    public S s;
    public GenericBar() {}
}

公共类GenericBar共享GenericBar实现共享GenericBar实现是的,我需要
服务
类只负责
条码
类型。感谢您的解释。是的,我需要
服务
类只负责
条码
类型。感谢您的解释。