当使用 Bounded 类型参数或直接使用类型 Interface 时

Pau*_*Pau 5 java generics bounded-wildcard

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

使用有界类型参数:

public static <I extends InterfaceObj> void isTrue(boolean expression, I interfaceobj) {
        if(!expression){
            throw new RunTimeException(interfaceobj);
        }}
Run Code Online (Sandbox Code Playgroud)

否则你可以使用接口类型:

public static void isTrue(boolean expression, InterfaceObj interfaceobj) {
        if(!expression){
            throw new RunTimeException(interfaceobj);
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后,如果我有一个实现 InterfaceObj 的类,我可以在第一个和第二个示例中使用它,这样我就看不到其中一个或另一个的差异、优点和缺点。

  • 每种情况有什么区别?
  • 什么时候使用其中一种或另一种更好?

dav*_*xxx 3

来自甲骨文:

有时您可能想要限制可用作参数化类型中的类型参数的类型。例如,对数字进行操作的方法可能只想接受 Number 或其子类的实例。这就是有界类型参数的用途。

从功能上讲,它是完全相同的,因为使用接口作为参数类型,它可能也只想接受 Number 或其子类的实例

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

就您而言,我更喜欢使用不带通配符的原始接口类型,因为它不太冗长。


这并不意味着方法中的有界类型参数没有用。当您使用多个绑定类型参数时,它确实很有用。
想象一下,您的方法将接受一个参数,条件是该参数同时属于两个指定类型:InterfaceObjOtherInterfaceObj

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

public static  void isTrue(boolean expression, MyTwoInterfacesObj interfaceobj) {
  if (!expression) {
      throw new RuntimeException();
  }
}
Run Code Online (Sandbox Code Playgroud)

使用多个绑定类型参数,您无需创建额外的接口。您可以指定它,例如:

public static <I extends InterfaceObj & OtherInterfaceObj> void isTrue(boolean expression, I interfaceobj) {
  if (!expression) {
      throw new RuntimeException();
  }
}
Run Code Online (Sandbox Code Playgroud)

对于两个接口,限制它们的参数类型有点尴尬,想象一下三个或四个接口以及它们的多种可能的混合。