簡體   English   中英

java自動函數調用

[英]java automatic function calling

我有一個數學類,它存儲n個數組列表中的表達式表示我目前有三個類AdditionArray MultipleArray和Variable它們都實現了我的Number接口。

public interface Number {

  public Number Multiply(Number number);

在實現Number i的類中,已經重載了像Multiply這樣的操作

public class MultipleArray extends ArrayList<Number> implements Number{
  public Number Multiply(AdditionArray number);
  public Number Multiply(Number number){throw new Exception("woops");}

事情是java不會在運行時自動調用正確的重載函數。 它接縫是在編譯時搞清楚的

例如

Number someNumber = new MultipleArray();
Number someOtherNumber = new AdditonArray();

MultipleArray result2 = someNumber.Multiply(someOtherNumber); //calls the correct function

Number result2 = someNumber.Multiply(someOtherNumber); // throws the woops exception

為什么java這樣做。 還有另一種方法可以實現這一點。 某種工廠比如說?

干杯,馬克

在Java中, 重載是一種編譯時多態,而重寫是一種運行時多態。 請參閱Java中方法重寫和方法重載之間的區別是什么?

這意味着編譯器將始終在編譯時確定要調用的兩個重載方法中的哪一個,而不是被覆蓋的方法(這是在子節點中定義的具有相同簽名的方法作為祖先類),可以基於此方法動態調度這些方法。正在調用該方法的類的運行時類型。

我沒有真正查看你的代碼,只是為了回答你的主要問題--Java確實根據最近的類型確定在編譯時要調用的內容。 如果它在運行時完成,它將是一種動態語言。

Java的速度非常快 - 但它在運行時沒有考慮太多,因此速度很快。 它往往比Python快10倍,比Ruby快100倍。

如果你想在這方面有更多的靈活性,我建議你根本不使用Java的綁定,而是創建一個“Operation”對象並手動將它綁定到你的“Numbers”。 通過這種方式,您可以從對象中制作出非常酷的代數樹。 如果沒別的話它很有趣 - 我已經完成了幾次。 它仍然會很快。

正如Bill K所說,Java在編譯時確定了這一點,這是設計的。

實現這一點的真正標准方法是在重載方法中使用超類型來檢查子類的類型,並使用強制轉換委托或者根據需要拋出異常。

使用Generics是另一種選擇,它可以提高你的類型安全性,但是我對你的代碼知之甚少,不知道它是否會全面運作。 通用數字界面可能如下所示:

 public interface Number<T extends Number> {
       public T multiply(Number<? extends T> number);
 }

泛型可能會在邊緣變得奇怪,因此放棄類型安全性並檢查參數類型可能是值得的。

暫無
暫無

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

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