考虑以下程序:
import java.util.List;
import java.util.ArrayList;
public class TypeTest {
public static class TypeTestA extends TypeTest {
}
public static class TypeTestB extends TypeTest {
}
public static final class Printer {
public void print(TypeTest t) {
System.out.println("T");
}
public void print(TypeTestA t) {
System.out.println("A");
}
public void print(TypeTestB t) {
System.out.println("B");
}
public <T extends TypeTest> void print(List<T> t) {
for (T tt : t) {
print(normalize(tt.getClass(), tt));
}
}
private static <T> T normalize(Class<T> clz, Object o) {
return clz.cast(o);
}
}
public static void main(String[] args) {
Printer printer = new Printer();
TypeTest t1 = new TypeTest();
printer.print(t1);
TypeTestA t2 = new TypeTestA();
printer.print(t2);
TypeTestB t3 = new TypeTestB();
printer.print(t3);
System.out.println("....................");
List<TypeTestB> tb1 = new ArrayList<TypeTestB>();
tb1.add(t3);
printer.print(tb1);
}
}
现在可以打印主要方法:
T
A
B
....................
T
我应该怎么做才能打印以下内容?
T
A
B
....................
B
我想避免为每种可以打印的类型编写如下的循环:
public void printTypeTestB(List<TypeTestB> t) {
for (TypeTestB tt : t) {
print(tt);
}
}
解决方法:
问题的根源是Java方法重载是在编译时根据方法参数表达式的声明类型来解决的.您的程序似乎正在尝试将运行时分派用于不同的方法重载.那在Java中根本行不通.
您在示例中使用泛型的事实有点让人讨厌.如果您替换类型参数< T> ;,则会遇到同样的问题.使用TypeTest.