具有多接口转换的Java泛型

具有多接口转换的Java泛型,java,generics,Java,Generics,我认为: public interface I1{} public interface I2{} public class A implements I1, I2{} public class B implements I1, I2{} 为什么我不能有一个方法: public static <K extends I1 & I2> K get(){ if(some condition) return new A(); // I am gett

我认为:

public interface I1{}
public interface I2{}
public class A implements I1, I2{}
public class B implements I1, I2{}
为什么我不能有一个方法:

public static <K extends I1 & I2> K get(){
      if(some condition)
          return new A();  // I am getting "type mismatch" error
      else
          return new B(); // I am getting "type mismatch" error
}

public static void main(String[] args) {
     I1 myThing = get(); // because I want to use only methods from I1 interface..
}
publicstatickget(){
如果(某些条件)
返回新的A();//我遇到“类型不匹配”错误
其他的
return new B();//出现“类型不匹配”错误
}
公共静态void main(字符串[]args){
I1 myThing=get();//因为我只想使用来自I1接口的方法。。
}
只有当我添加一个类似“return(K)new a();”这样的强制转换时,它才会起作用,即使这样,它也会给出一个不安全的强制转换警告

我可以创建一个扩展I1和I2的接口,但如果我开始这样做,我将得到大量的类和混乱的代码。
正确的方法是什么?

如果您不想创建“交叉口类型接口”,我想您可以这样做

public static I1 getAsI1(){
      if(some condition)
          return new A();  // I am getting "type mismatch" error
      else
          return new B(); // I am getting "type mismatch" error
}

public static I2 getAsI2(){
   return (I2) getAsI1();  // above implementation guarantees the cast will work
}

然后调用者可以选择他们想要的接口。

因为如果调用者调用YourClass.get(),该方法应该返回一个Foo,而不是a或B。@JBNizet回答了“为什么这个不起作用?”部分。至于“正确的方法是什么”(在Java中获取交集类型),我认为您确实需要创建一个额外的接口。@JBNizet YourClass.get()是什么意思,它甚至不是一个合法的语法是的(如果定义方法get()的类名为YourClass,但我们不知道它是如何命名的)。通过以这种方式定义该方法,您可以让调用方决定该方法应返回的类型(在我的示例中为Foo),前提是该类型扩展了I1和I2。因此,如果调用方有一个名为Foo的类,该类实现了I1和I2,并以这种方式调用您的方法(或仅使用Foo-Foo=YourClass.get()),那么它将导致ClassCastException。然后让您的方法返回I1,而不是K。如果该方法应该返回I1,则它不需要是泛型的。以声明的方式声明它会使代码Foo Foo=YourClass.get()有效,并且是预期的。如果不应该这样,则表明您声明方法的方式不正确。