簡體   English   中英

單個Java變量可以接受基元或對象的數組嗎?

[英]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中,所有基元類型都有對象包裝器。 例如。 IntegerintBoolean值為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”解決這個問題:)

有點不同的方法,你考慮過autoboxingvarargs的組合嗎? 然而,這需要更高級別的更改,因此您不必傳遞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.

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