簡體   English   中英

如何在不知道類名的情況下調用方法?

[英]how to call method without knowing the class name?

我在下面定義了兩個類:

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();
   }
}

不幸的是,上述方法無效。

我想要做的是簡單地將abc更改a junkChild BigDecimal ,而無需再次重寫DoSomething() 即使我必須再次編寫它,代碼也會完全相同,所以應該有一種方法可以讓它無需編寫即可完成。 DoSomething函數應該檢查類型a1是否具有正確輸入和返回類型的add方法,如果是,則調用它而不用擔心abc是什么類型。

可以這樣做嗎?

不,你不能這樣做 - 至少在編譯時不行。 這兩種add方法實際上是無關的 - 它們不是來自界面或類似的東西。

你可以用反射來做(在為abc或類似的東西添加屬性之后 - 字段不能像這樣被“覆蓋”),但它不會非常好。

您要問的編程語言功能稱為duck typing ,Java不支持它。 你必須堅持原始的包裝方法策略。

如前所述,Java沒有“鴨子打字”,這兩種類型不共享有用的界面。 BigDecimal和BigInteger都擴展了Number,但是add()方法不是該接口的一部分,所以它沒有幫助。

我認為您需要在doSomething()的方法參數中明確說明您正在操作的內容。 然后你可以覆蓋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();
}

第二種方法只是一種轉換方法,然后在第一種方法中調用實際邏輯。

由於Number(兩個類的最近祖先沒有add方法),您可以先將BigInteger轉換為BigDecimal:

new BigDecimal(bi)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM