[英]How to pass an array to a function instead of the values in it in Java
我有一個接受四個雙打的函數,我有一個包含四個雙打的數組。 有什么辦法可以將數組傳遞給函數嗎? 例如:
double[] myArray = {1.0, 2.0, 3.0, 4.0};
function myFunc(double val1, double val2, double, val3, double val4) {
//do something with the values
}
myFunc(myArray[0], myArray[1], myArray[2], myArray[3]); // Do I have to do this?
myFunc(myArray); // Or can I do something like this?
謝謝!
編輯:當我說myFunc(myArray)
我的意思是“Java 是否內置了任何格式來允許我執行與此相同的操作?” 抱歉我不清楚:(
myFunc(myArray[0], myArray[1], myArray[2], myArray[3]); // Do I have to do this?
不,但你會希望你做到了。
這是使用反射的非擴展盒裝類型的簡化示例。 如果你還想支持原始類型,你可以為每個這樣的類型添加一個call
覆蓋:
import java.util.*;
import java.lang.reflect.*;
class Test extends ArrayCallable {
void myFunc(Double val1, Double val2, Double val3, Double val4) {
System.out.println("myFunc is running");
}
public static void main(String[] args) throws Exception {
Double[] myArray = {1.0, 2.0, 3.0, 4.0};
new Test().call("myFunc", myArray);
}
}
class ArrayCallable {
void call(String name, Object[] params) throws Exception {
Class[] types = Arrays.stream(params).map(c -> c.getClass()).toArray(Class[]::new);
Method m = getClass().getDeclaredMethod(name, types);
m.invoke(this, params);
}
}
這比你的方式慢得多,而且更容易出錯,但它確實允許你做你想做的事。
為什么 Java 使這變得困難?
這是一個概念上有問題的操作。 您正在嘗試將動態分派應用於具有靜態分派的靜態類型語言。 不能再依賴正常的編譯器和類加載檢查。 系統無法高效地分派或 JIT,程序員必須在運行時處理更多的輸入錯誤。
很容易做到這一點的語言(如 Lisp 或 JavaScript)通常缺乏方法重載,並且無論如何都將參數作為列表傳遞,因此不會受到太多影響。
我應該怎么做?
如果您想允許使用一系列雙精度數或數組調用myFunc
,您應該將其設為可變參數。
對於調用myFunc
的程序員來說,這感覺是一樣的,但通過允許 Java 進行靜態分派並允許myFunc
的實現者決定如何處理可變數量的參數,使生活更輕松。
您可以將函數的參數更改為:
function myFunc(double[] array) {
//do something with the values
}
現在您將能夠將整個數組傳遞給函數
myFunc(myArray);
double[] myArray = {1.0, 2.0, 3.0, 4.0};
您可以將對象 - myArray 傳遞給您的方法,然后使用索引讀取存儲在數組中的各個值:
public void someFunction(double[] myArray){
double val1 = myArray[0];
double val2 = myArray[1];
}
並確保在 main 方法中調用該函數:
public static void main(String[] args){
double[] myArray = {1.0, 2.0, 3.0, 4.0};
someFunction(myArray);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.