2010-01-04 118 views
3

我在下面两个类中定义:如何在不知道类名的情况下调用方法?

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改变abcBigDecimal无需再次改写DoSomething()。即使我必须重新编写代码,代码也会完全一样,所以应该有一种方法可以在不需要编写代码的情况下完成这项工作。该DoSomething功能应该检查类型a1具有正确的输入和返回类型的add方法,如果是这样,调用它而不会担心什么类型abc是。

可以这样做吗?

+0

你应该阅读反思。它将完成你的问题的第二部分。至于第一部分,不要直接使用字段'a','b'和'c',而是使用在子类中重写的方法'getA','getB'和'getC'。 – 2010-01-04 16:17:47

+0

这听起来像你真正想要的是C++ - 就像模板一样。 – 2010-01-04 16:21:04

+2

这听起来像他真正想要的是“鸭子打字”。 – Asaph 2010-01-04 16:22:53

回答

4

不,你不能这样做 - 至少不是在编译时。两个add方法实际上没有关系 - 它们不是来自界面或类似的东西。

你可以用反射(在为a,bc或类似的东西添加属性 - 字段不能像这样被“覆盖”),但它不会非常好。

+0

最准确的答案。 出于好奇,为什么可以用'System.out.print'来做到这一点? (我们可以为任意类定义'toString'方法) – Jus12 2010-01-05 18:31:23

+0

@ Jus12:'toString()'从所有类最终继承的'Object'继承。任何类都可以重写'toString()'。 – Asaph 2010-12-19 03:31:33

2

您提到的编程语言功能称为duck typing,Java不支持它。你必须坚持你最初的包装方法策略。

1

,因为数(两个类的最近的祖先没有add方法),您可以将您的BigInteger先转换为BigDecimal:

new BigDecimal(bi) 
2

正如人们所说的,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 <:{def add [T](a:T,b:T):Unit; val a:T}](bar:T):T ='' – Jus12 2017-08-02 14:47:19

相关问题