![](/img/trans.png)
[英]How can you call a class that is implementing a certain interface without knowing its name?
[英]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();
}
}
不幸的是,上述方法無效。
我想要做的是簡單地將a
, b
, c
更改a
junkChild
BigDecimal
,而無需再次重寫DoSomething()
。 即使我必須再次編寫它,代碼也會完全相同,所以應該有一種方法可以讓它無需編寫即可完成。 DoSomething
函數應該檢查類型a1
是否具有正確輸入和返回類型的add
方法,如果是,則調用它而不用擔心a
, b
, c
是什么類型。
可以這樣做嗎?
不,你不能這樣做 - 至少在編譯時不行。 這兩種add
方法實際上是無關的 - 它們不是來自界面或類似的東西。
你可以用反射來做(在為a
, b
和c
或類似的東西添加屬性之后 - 字段不能像這樣被“覆蓋”),但它不會非常好。
您要問的編程語言功能稱為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.