Java中的泛型方法是否可以根据输入的类型调用特定的其他方法?
我尝试了以下示例,希望能够代表问题.
class X {
public void pr(Object s) {
System.out.println("Object");
}
public void pr(String s) {
System.out.println("String");
}
public <T> void go(T x) {
this.pr(x);
}
public static void main(String[] args) {
String v = "hello";
X x = new X();
// Both print "Object", while I want "String"
x.go(v);
x.<String>go(v);
}
}
Run Code Online (Sandbox Code Playgroud)
我希望go()调用pr(String).但无论我做什么,都会调用pr(Object).
以上示例仅供演示,实际应用要复杂得多.
提前致谢.
不幸的是,由于类型擦除,你所描述的是不可能的,因此在运行时T被视为Object如此pr(Object)选择.
一种可能的解决方案是手动测试传递数据的类型并调用正确的方法,几乎没有像铸造一样的帮助
public <T> void go(T x) {
if (x instanceof String)
pr((String)x);
else
pr(x);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果您可以编辑类的代码,您将传递给go方法,那么首选解决方案是pr在每个类中添加/实现方法,以便您可以使用多态来调用它们:
interface CanPR{
void pr();
}
class Foo implements CanPR{
@Override
public void pr() {
System.out.println("pr from Foo");
}
}
class Bar implements CanPR{
@Override
public void pr() {
System.out.println("pr from Bar");
}
}
class X {
public <T extends CanPR> void go(T x) {
x.pr();
}
public static void main(String[] args) {
CanPR a = new Foo();
CanPR b = new Bar();
X x = new X();
x.go(a); //prints: pr from Foo
x.go(b); //prints: pr from Bar
}
}
Run Code Online (Sandbox Code Playgroud)
实际上在这种情况下你甚至不需要泛型类型,go所以你可以重写它
public void go(CanPR x) {
x.pr();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2642 次 |
| 最近记录: |