Java泛型 - 方法参数

4
在这种情况下,即使 Bar 只在一个方法中使用,是否需要对整个接口进行参数化?
public interface IFoo<T>{

    void method1(Bar<T> bar);

    //Many other methods that don't use Bar....

}  

public class Foo1 implements IFoo<Yellow>{

    void method1(Bar<Yellow> bar){...};

    //Many other methods that don't use Bar....

}


public class Foo2 implements IFoo<Green>{

    void method1(Bar<Green> bar){...};

    //Many other methods that don't use Bar....

}
3个回答

5
不,从语法角度来说并不需要。你也可以这样做:

不,从语法角度来说并不必要。你也可以这样做:

public interface IFoo {

  <T> void method1(Bar<T> bar);

  /* Many other methods that don't use Bar…  */

}

或者这样:
public interface IFoo {

  void method1(Bar<?> bar);

  /* Many other methods that don't use Bar…  */

}

正确的选择取决于 IFoo 的语义以及它的实现可能通过 method1 接收到的 Bar 实例将要执行的操作。

2
我想用不同的方式提出问题,因为“需要”暗示了成本,而实际上并没有。我认为它是否仅用于一个或多个方法并不重要。当您对实例进行多次调用时,类型参数如何变化?如果在实例化实例后常量,则对整个接口进行参数化;如果每次调用可能不同,则对方法进行参数化。这样,参数的类型实际上提供了有关代码的信息,提高了其含义和清晰度。
编辑:例如,如果对于同一实例,类型参数有时会从调用到调用不同...则必须是方法参数。

某些 IFoo 实现可能会保持参数类型不变,而其他实现则可能会有所变化 :) - tinkertime
我认为有些实现无法强制执行特定类型参数,而其他实现则允许其更改。 - ColinD

0

你没有扩展接口。这是故意的吗?你可以这样做:

public class Foo2 implements IFoo<Green> {
  void method1(Bar<Green> bar);
}

只是做这个:

public class Foo<Green> {
  void method1(Bar<Green> bar);
}

无法编译。


抱歉,应该已经实现了。 - tinkertime
我很高兴你指出了那个问题,它使问题更加完善,所以我相信现在会有更多的人尝试回答它 :-) - KLE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接