Java 直接使用有界类型参数或类型接口时

Java 直接使用有界类型参数或类型接口时,java,generics,bounded-wildcard,Java,Generics,Bounded Wildcard,如果需要将接口类型的参数传递给方法,可以使用两个impl 使用有界类型参数: public static <I extends InterfaceObj> void isTrue(boolean expression, I interfaceobj) { if(!expression){ throw new RunTimeException(interfaceobj); }} 然后,如果我有一个实现InterfaceObj的类

如果需要将接口类型的参数传递给方法,可以使用两个impl

使用有界类型参数:

public static <I extends InterfaceObj> void isTrue(boolean expression, I interfaceobj) {
        if(!expression){
            throw new RunTimeException(interfaceobj);
        }}
然后,如果我有一个实现InterfaceObj的类,我可以在第一个和第二个示例中使用它,这样我就看不到其中的区别、优点和缺点

  • 每种情况的区别是什么
  • 什么时候使用一个或另一个更好
来自oracle:

有时,您可能希望限制可以使用的类型 用作参数化类型中的类型参数。例如,一个方法 对数字进行操作的对象可能只希望接受数字的实例 或其子类。这就是有界类型参数的用途

从功能上讲,这是完全相同的,因为如果将接口作为参数类型,它也可能只希望接受Number或其子类的实例

从技术上讲,它略有不同,因为编译类应该是不同的

在您的情况下,我更喜欢使用不带通配符的原始接口类型,因为它不太冗长


这并不意味着方法中的有界类型参数是无用的。 当您使用多个绑定类型参数时,它确实很有用。
假设您的方法在同时属于两种指定类型的条件下接受参数:
InterfaceObj
OtherInterfaceObj

对于接口类型,为了满足这一需求,您应该创建另一个扩展这两个接口的接口,并在方法中使用它,例如:

public static  void isTrue(boolean expression, MyTwoInterfacesObj interfaceobj) {
  if (!expression) {
      throw new RuntimeException();
  }
}
public static <I extends InterfaceObj & OtherInterfaceObj> void isTrue(boolean expression, I interfaceobj) {
  if (!expression) {
      throw new RuntimeException();
  }
}
对于多个绑定类型参数,您不需要创建额外的接口。您可以指定它,例如:

public static  void isTrue(boolean expression, MyTwoInterfacesObj interfaceobj) {
  if (!expression) {
      throw new RuntimeException();
  }
}
public static <I extends InterfaceObj & OtherInterfaceObj> void isTrue(boolean expression, I interfaceobj) {
  if (!expression) {
      throw new RuntimeException();
  }
}
publicstaticvoidistrue(布尔表达式,I接口obj){
if(!表达式){
抛出新的RuntimeException();
}
}
对于两个接口,将参数类型限制在这两个接口上有点尴尬,想象一下三个或四个接口以及它们的多种可能混合

我看不出一个或多个方面的区别、优点和缺点 其他的

我想你忘了收藏

如果您有一个集合参数,那么这就是有界类型参数的真正优势所在

在该方法中,您只能传递一个已稳定的列表,如
List List List=new ArrayList()

publicstaticvoidprocesslist(列表输入){
//...
}
但如果使用有界参数化泛型,则可以将下面的所有列表作为输入传递

List<InterfaceObj> list = new ArrayList<InterfaceObj>();
List<SubInterfaceObj> list = new ArrayList<SubInterfaceObj>();
List<SubSubInterfaceObj> list = new ArrayList<SubSubInterfaceObj>();

public static void processList(List<? extends InterfaceObj> input){
    //...
}
List List=new ArrayList();
列表=新的ArrayList();
列表=新的ArrayList();

publicstaticvoidprocesslist(List区别在于,对于第一个或类型化的版本,方法中的代码可以知道传递了哪个确切的子类型,但是第二个版本不能

如果您的方法返回与参数类型相同的列表,您会更清楚地注意到差异。版本一可以返回
列表
——类型与参数(子)类型相同的列表,但版本二只能返回类型为超类型的
列表