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);
我无法理解所有这些。
答案 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程序员和非英语母语者来说,这很难...