如何在不知道类名的情况下调用方法?
问题描述:
我在下面两个类中定义:如何在不知道类名的情况下调用方法?
public class junk {
private BigInteger a = BigIngeger.valueOf(1), b=BigInteger.valueOf(2), c;
public void DoSomething() {
c = a.add(b);
}
// ... other stuff here
}
public class junkChild extends junk {
private BigDecimal a = BigDecimal.valueOf(1), b=BigDecimal.valueOf(2), c;
// I want a, b, c to override the original BigInteger a,b,c
// ... other stuff here
}
public class myClass {
public static void main(String args[]) {
junk a1 = new junkChild();
a1.DoSomething();
}
}
不幸的是,上述方法无效。
我想要做的是简单地在junkChild
改变a
,b
,c
到BigDecimal
无需再次改写DoSomething()
。即使我必须重新编写代码,代码也会完全一样,所以应该有一种方法可以在不需要编写代码的情况下完成这项工作。该DoSomething
功能应该检查类型a1
具有正确的输入和返回类型的add
方法,如果是这样,调用它而不会担心什么类型a
,b
,c
是。
可以这样做吗?
答
,因为数(两个类的最近的祖先没有add方法),您可以将您的BigInteger先转换为BigDecimal:
new BigDecimal(bi)
答
正如人们所说的,Java没有做“鸭打字“这两种类型不共享有用的界面。 BigDecimal和BigInteger都扩展了Number,但add()方法不是该接口的一部分,所以它不起作用。
我认为你需要明确你在doSomething()的方法参数上进行操作。然后,你可以overrride doSomething的()以在两种类型的操作:
public BigDecimal doSomething(BigDecimal a, BigDecimal b) {
return a.add(b);
}
public BigInteger doSomething(BigInteger a, BigInteger b) {
BigDecimal x = new BigDecimal(a);
BigDecimal y = new BigDecimal(b);
BigDecimal z = doSomething(x, y);
return z.toBigInteger();
}
第二种方法是一个简单的转换方法,该方法然后调用在第一种方法中的实际的逻辑。
+0
我从那以后就转移到了Scala。在Scala中,这些东西非常简单:def foo [T Jus12 2017-08-02 14:47:19
你应该阅读反思。它将完成你的问题的第二部分。至于第一部分,不要直接使用字段'a','b'和'c',而是使用在子类中重写的方法'getA','getB'和'getC'。 – 2010-01-04 16:17:47
这听起来像你真正想要的是C++ - 就像模板一样。 – 2010-01-04 16:21:04
这听起来像他真正想要的是“鸭子打字”。 – Asaph 2010-01-04 16:22:53