2010-01-04 115 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

相關問題