我在 java 中有以下代碼可以很好地用于 var args 和一維陣列。
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
MyConsumer<Integer> method1 = n -> n * n;
Integer[] result1 = method1.run(10);
for(Integer i : result1) {
System.out.println(i);
}
MyConsumer<Integer> method3 = n -> n * n;
Integer[] result3 = new Integer[]{10, 100};
method3.run(result3);
for(Integer i : result3) {
System.out.println(i);
}
}
}
interface MyConsumer<T> {
T execute(T args);
default T[] run(T ...args) throws ClassNotFoundException {
if (args.length > 0) {
iterate(args);
return args;
}
return null;
}
default void iterate(T ...obj) {
for (int i = 0; i < obj.length; i ) {
if (obj[i].getClass().isArray()) {
iterate(obj[i]);
} else {
obj[i] = execute(obj[i]);
}
}
}
}
現在我希望它也適用于多維陣列,如下所示:
MyConsumer<Integer> method5 = n -> n * n;
Integer[][] result5 = new Integer[][]{{10, 100}, {20}};
method5.run(result5);
for(Integer[] i : result5) {
for (Integer j : i) {
System.out.println(j);
}
}
以上編譯失敗,出現以下錯誤
error: method run in interface MyConsumer cannot be applied to given types;
介面中的代碼適用于 var args 和所有維陣列,但這里的問題是接受一個多維陣列作為 varargs 引數,我們必須定義引數型別和回傳型別,其維度為 -
- 二維引數型別是
T[]... args,回傳型別是T[][] - 3維引數型別是
T[][]... args,回傳型別是T[][][]
有人可以建議我解決方案或其他替代方案嗎!我認為的解決方案是方法多載。
提前致謝!
uj5u.com熱心網友回復:
T[], T[][],T[][][]等最具體的常見超型別是Object[]. 所以你的方法可以接受一個Object[](或等效的Object...)引數,但這意味著你失去了型別安全——編譯器不會檢查傳遞的引數是否是 type T[], T[][],T[][][]等。
(謝天謝地,我們不需要處理原始型別的陣列。如果我們必須處理原始型別的陣列,我們可以使用的唯一常見超型別是Object,并且我們必須使用 的方法java.lang.reflect.Array與其進行一般互動. 但是,由于我們只處理參考型別的陣列,我們可以使用 的超型別Object[],并且可以在 上使用常規的陣列操作Object[]。)
所以你的iterate()方法可以是這樣的:
default void iterate(Object... obj) {
for (int i = 0; i < obj.length; i ) {
if (obj[i] instanceof Object[]) {
iterate((Object[]) obj[i]);
} else {
obj[i] = execute((T) obj[i]);
}
}
}
另一件要提到的是,這只會在T它本身不是Object[]. 此方法不知道是什么T,并且將簡單地遞回到不是 的實體的第一級Object[],并假設那是T. 但是,如果T它本身是一個參考陣列型別,那么這將遞回到T.
uj5u.com熱心網友回復:
, 發布的答案@newacct是正確的。對于以下情況,它會以手動型別轉換為代價:
MyConsumer<Integer> m = n -> n * n;
Object[] res = m.run(10);
for(Object i : res) {
System.out.println((Integer)i));
}
或者
MyConsumer<Integer> m = n -> n * n;
Integer[][] a = new Integer[][]{{10, 100}, {20}};
Integer[][] b = new Integer[][]{{10}, {20}};
Object[] c = m.run(a, b);
for(Object res : c) {
for (Object[] i : (Object[][])res) {
for (Object j : i) {
System.out.println((Integer)j);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/510455.html
