当我注意到以下代码可以编译并且输出 Integer / String
时,我感到非常惊讶:
public final class GenericsTest {
private static <T> void method(T arg1, T arg2) {
System.out.println(arg1.getClass().getSimpleName());
System.out.println(arg2.getClass().getSimpleName());
}
public static void main(String[] args) {
method(1, "1");
}
}
我本以为会有编译错误。
这段代码为什么可以编译通过?
如何确保参数拥有相同类型的正确方式?
编辑: 那么对于有界类型参数呢?我能想到的最好方法是:
private static <T, U extends T> void method(T arg1, U arg2) {
System.out.println(arg1.getClass().getSimpleName());
System.out.println(arg2.getClass().getSimpleName());
}
很遗憾,Java不允许循环约束。
<T extends U,U extends T>
无法编译。这是死路吗?
GenericsTest.<String>method(1, "1"); //编译失败
- August