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

时间:2016-08-12 09:07:45

标签: java generics bounded-wildcard

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

使用有界类型参数:

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

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

public static void isTrue(boolean expression, InterfaceObj interfaceobj) {
        if(!expression){
            throw new RunTimeException(interfaceobj);
        }
    }

然后,如果我有一个实现InterfaceObj的类,我可以在第一个和第二个例子中使用它,所以我不会看到一个或另一个的区别,优点和缺点。

  • 每种情况有什么不同?
  • 什么时候使用其中一个更好?

3 个答案:

答案 0 :(得分:2)

来自oracle:

  

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

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

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

在你的情况下,我更喜欢使用没有通配符的原始接口类型,因为它不那么详细。

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

使用接口类型来满足此需求时,您应该创建另一个扩展这两个接口的接口,您可以在方法中使用它,例如:

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();
  }
}

使用两个接口,限制它们的参数类型有点尴尬,想象有三个或四个接口和多个可能的混合。

答案 1 :(得分:2)

  

我没有看到一个或多个的区别,优点和缺点   其他

我想你忘了收藏了!

如果您有一个Collection参数,有界类型参数的真正优势在哪里发挥作用

在此方法中,您只能传递已设置为List<InterfaceObj> list = new ArrayList<InterfaceObj>();

的列表
public static void processList(List<InterfaceObj> input){
    //...
}

但如果您使用有界参数化通用,则可以将以下所有列表作为输入传递

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){
    //...
}

答案 2 :(得分:1)

不同之处在于,对于第一个或类型的版本,方法中的代码可以知道传递了哪个确切的子类型,但第二个版本不能。< / p>

如果您的方法返回与参数相同类型的列表,您会更清楚地注意到差异。版本1可以返回List<I> - 一个类型与参数的(子)类型相同的列表,但版本2只能返回其类型为超类型的List<InterfaceObj>