[英]Can a single Java variable accept an array of either primitives or objects?
例如,對於讀取數組元素的單個方法,程序員如何允許將對象數組或基元數組作為參數傳遞? Object[] arrayName
只接受一個Object[] arrayName
數組,而泛型變量不接受原語。 有沒有辦法接受任何類型的數組而不重載方法?
您可以將任一類型的數組作為Object
傳遞。
從那里,你必須使用反射。 特別是isArray()
, getComponentType()
和isPrimitive()
將告訴方法傳遞了什么。 這是原始數據類型引入的一些不幸的不整潔。
Object[]
和(例如) int[]
的唯一常見超類型是Object
。 所以你的問題的答案是“不”。
編輯:是的你可以使用Object
作為參數類型,但是你需要在使用它之前跳過箍(反射或大量的類型轉換)。 你必須處理傳遞的東西根本不是數組的情況。
OP的目標是找到比重載更好的單一類型。 使用Object
作為claytons數組類型的IMO顯然不符合此目標。 它需要更復雜的代碼,效率更低,更容易受到意外的運行時類型錯誤的影響。
在java中,所有基元類型都有對象包裝器。 例如。 Integer
為int
, Boolean
值為Boolean
boolean
等。如果您願意接受一個對象包裝器數組,那么讓您的方法接受Object[]
應該適合您。
背景是什么?
您的情況可能是調用泛型,您可以根據需要傳遞Collection<Integer>
或Collection<SomeOtherType>
。
class Test
{
public static void main(String[] args)
{
run(new String[] {"Hello", "World"});
Integer[] inputs = {1, 2, 3};
run(inputs);
//run(new int[] {1, 2, 3}); //this would not do!
}
private static void run(Object[] inputs)
{
for(Object input : inputs)
System.out.println(input);
}
}
輸出:Hello World 1 2 3
因此,即使使用自動裝箱,對象數組也不能使用原始數據,因為數組本身是從Object派生的。 因此,我對這個問題的回答是否定的。
但是,在C#中你可以使用神奇的“var”解決這個問題:)
有點不同的方法,你考慮過autoboxing和varargs的組合嗎? 然而,這需要更高級別的更改,因此您不必傳遞int[] {1, 2, 3}
,而是必須傳入1, 2, 3
。 不確定這是否重要。
public static void main(String... args) {
doStuff("one", "two", "three");
doStuff(1, 2, 3);
doStuff("one", 2, 3.3);
doStuff(new String[] {"one", "two", "three"});
doStuff(new Integer[] {1, 2, 3});
doStuff(new Object[] {"one", 2, 3.3});
}
public static void doStuff(Object... args) {
for (Object o : args) {
// ...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.