通用方法,多个括号,类型

时间:2011-12-16 12:35:29

标签: java generics

http://docs.oracle.com/javase/tutorial/java/generics/genmethods.html 引自那里 -

  

更真实地使用泛型方法可能类似于以下内容,它定义了一个静态方法,将对单个项的引用填充到多个框中:

public static <U> void fillBoxes(U u, List<Box<U>> boxes) { 
for (Box<U> box: boxes {
  box.add(u); }
     

}

在这里,List<Box<U>>做了什么?这是如何工作的?

此外,

  

要使用此方法,您的代码应如下所示:

 Crayon red = ...;
 List<Box<Crayon>> crayonBoxes = ...;

The complete syntax for invoking this method is:

Box.<Crayon>fillBoxes(red, crayonBoxes);

我无法理解所有这些。

3 个答案:

答案 0 :(得分:3)

您可以将U视为Type或Interface的一种占位符。 如果你有一个类Foo并用Foo替换方法声明中的所有U,它将采用Foo和List&gt;的实例。 正如名称“Generic”所说,它是用实际类型“替换”泛型类型参数U的通用方法。通过这种方式,您可以强制使用类型U对象的每个人也必须使用List&gt;调用方法。 以Foo为例,我只能打电话

public static <U> void fillBoxes(U u, List<Box<U>> boxes) {

Foo foo = new Foo();
List<Box<Foo>> fooList = new ArrayList<Box<Foo>>();
fillBoxes(foo, fooList);

答案 1 :(得分:1)

List<Box<U>>只是意味着它是一个框列表,您可以在其中存储U型对象。

例如,如果你有“蜡笔”,“铅笔”,“笔”等类,实现界面“U”,你可以将他们的实例存储在这样的盒子里。

答案 2 :(得分:1)

List是一个通用集合。 Box是另一种通用。

您可以声明Box<Crayon>来构建一盒蜡笔

List<Box>是Box的集合,但Box是通用的,需要框List<Box<Crayon>>的类型。

只需遵循泛型类型U.FillBoxes方法是静态public static <U> void fillBoxes(U u, List<Box<U>> boxes)。静态方法不需要实例,如果没有实例你不能声明方框Box<Crayon>的类型,你必须在方法Box.<Crayon>fillBoxes的调用中传递类型,知道该类型,编译器知道FillBoxes(U u)中的第一个参数是蜡笔类型,第二个参数是蜡笔盒列表(List<Box<U>> boxes)。

该方法将用红色蜡笔填充蜡笔盒列表:)

对于非Java程序员和非英语母语者来说,这很难...