Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 方法返回类型以实现多个接口-再次_Java_Generics_Inheritance_Interface_Return Value - Fatal编程技术网

Java 方法返回类型以实现多个接口-再次

Java 方法返回类型以实现多个接口-再次,java,generics,inheritance,interface,return-value,Java,Generics,Inheritance,Interface,Return Value,今天我遇到了以下问题。考虑设置: interface A { void foo(); } interface B { void bar(); } class Impl implements A,B { public void foo() { } public void bar() { } } class Usage { void worksAsParameter(){ acceptIt(new Impl()); }

今天我遇到了以下问题。考虑设置:

interface A {
    void foo();
}

interface B {
    void bar();
}

class Impl implements A,B {

    public void foo() { }
    public void bar() { }

}

class Usage {

    void worksAsParameter(){
        acceptIt(new Impl());
    }

    <T extends A & B> void acceptIt(T foo){

    }

    <T extends A & B> T returnIt(){
        return new Impl(); // <-- Compile error
    }

}
我最初的假设是,实现类(在本例中是
用法
)决定了
T
的具体类型,但它必须扩展
A
B
。显然是调用方/调用站点决定了
T
是什么,并且
Usage
必须提供一个可分配给
T
的值。但是,由于
T
只是一个编译时处理,因此除了
null
之外,不可能提供这样的值(因为它可以分配给任何对象)。 Afaik这意味着表单中的任何代码只能返回
null

<T extends A> T returnIt(){
    return x; // <-- Compile error
}
T returnIt(){
返回x;//原因

<T extends A & B> T returnIt(){
    return new Impl();
}

这定义了两个泛型

<T extends A, B>

其中T必须扩展A和B。

您可以像下面那样使用它

   <T extends A, B> T returnIt(){
    return  (T) new Impl(); // <-- cast it to type T
  }
T returnIt(){

return(T)new Impl();//您还可以执行以下操作以避免编译错误

       <T extends A & B> T returnIt(Class<T> type) {
        return type.cast(new Impl());
    }
T returnIt(类类型){
返回类型.cast(新Impl());
}

谢谢。问题仍然是一样的:)为什么你的AB示例能够工作?它从调用方的角度强制所有返回的对象必须是AB的子类。另外,我问题的第二部分是,是否可以构造任何可以工作的对象(null除外)有效吗?我的意图是保证返回的对象实现A和B。不多也不少。T可以是任何扩展A&B和AB扩展A&B的类。在这种情况下,您需要使用cast
(T)
并注意调用方可能需要一个特定的类。或者您不使用泛型并使用
Impl
那么我是否将其理解为“否”?
null
将是其可能返回的唯一值?
Impl returnIt(){
    return new Impl();
}
<T extends A, B>
<T extends A & B>
   <T extends A, B> T returnIt(){
    return  (T) new Impl(); // <-- cast it to type T
  }
       <T extends A & B> T returnIt(Class<T> type) {
        return type.cast(new Impl());
    }