tra*_*cer -1 java generics dispatch
考虑以下程序:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
主要方法现在打印:
T
A
B
....................
T
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能打印出以下内容?
T
A
B
....................
B
Run Code Online (Sandbox Code Playgroud)
我想避免为每种可打印的类型编写如下的循环:
public void printTypeTestB(List<TypeTestB> t) {
for (TypeTestB tt : t) {
print(tt);
}
}
Run Code Online (Sandbox Code Playgroud)
您的问题的根源是Java方法重载在编译时根据方法参数表达式的声明类型进行解析.您的程序似乎试图使用运行时调度到不同的方法重载.这根本不适用于Java.
你在你的例子中使用泛型的事实是一个红色的鲱鱼.如果用type替换了type参数<T>
,则会遇到同样的问题TypeTest
.
归档时间: |
|
查看次数: |
1317 次 |
最近记录: |