Java中使用泛型和泛型集合进行重载方法

3
拥有这两种方法的界面:

void add(T result);
void add(List<T> result);

我期望Java在运行时会调用适当的方法:
final U result = getResult();
myInterface.add(result);

如果U是一个列表,我认为第二个方法会被调用,但实际上总是调用了第一个方法。为什么会出现这种情况?应该如何正确地实现呢?

1
myInterface是什么类型的 - 在您当前的上下文中,TU分别代表什么? - luk2302
3
最简单的解决方案是命名。add(T)addAll(List<T>)。这就是List如何解决这个问题的方式。 - Obicere
1
在运行时,T 将被替换为 Object。因此,传递一个 List 可以使用任一方法。不确定编译时的情况。 - Tim Biegeleisen
@luk2302 假设 T 是一个 String,而 U 是一个 List<String> - Ignasi
在运行时是正确的,我想知道的是在编译时会调用哪个方法,如果已知U和T应该非常清楚。 - luk2302
如果你的 myInterface 是类型为 YourInterface<List<String>>,那么第一个方法将被调用;如果它是类型为 YourInterface<String>,我期望第二个方法将被调用。如果 U == T,那么无论它们是列表、列表的列表还是简单的字符串,我都期望第一个方法将被调用。 - luk2302
1个回答

3

这取决于 U 的编译时类型。如果 U 是无界的,编译器不能确定它是一个 List 还是一个 String 或者你的姑婆 Hilda。 因此,“非泛型化”代码如下:

final Object result = getResult();
myInterface.add(result);

然而,如果U实际上是<U extends List<?>>,编译器可以通过你的帮助缩小可能性,使得"非泛型化"的代码变为:
final List result = getResult();
myInterface.add(result);

这意味着你正在调用一个被期望重载的方法。


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