簡體   English   中英

Java:varargs聲明為構造函數

[英]Java: varargs declared constructor

我正在嘗試使用工廠設計模式來實例化對象。 雖然,構造函數具有varargs參數。

public class Foo implements Bar

public Foo(Object... args) {
}

在工廠中,我試圖得到這樣的構造函數:

private Constructor<Bar> getConstructor(Class<Bar> clazz) {
    return clazz.getDeclaredConstructor(Object.class);
}

但這是行不通的。 我也嘗試過:

private Constructor<Bar> getConstructor(Class<Bar> clazz) {
    return clazz.getDeclaredConstructor(Object[].class);
}

但是我將失去varargs的0參數功能。

有什么辦法嗎?

Varargs參數實際上是一個數組參數,由編譯器和其他一些工具進行特殊處理。 因此,您不能將其用作帶有反射的varargs參數-您必須將其用作數組。

有應對的方法更靈活的方式- MethodHandle從類java.lang.invoke包。 使用方法句柄,您不僅可以調用此方法,還可以轉換參數以使用與方法簽名不同的類型。

要使用varargs構造函數,您可以執行以下操作:

MethodHandle constructor = MethodHandles.publicLookup().findConstructor(Foo.class, Object[].class);
constructor.invoke(new Object(), 1, "");

但是我將失去varargs的0參數功能。

你有沒有嘗試過? 您將不會丟失此“ 0參數功能”。 完全沒有元素的數組是合法的。

您知道main()的原型,對不對? public static void main(String... args) 而且,我確定您已經知道這也可以寫成public static void main(String[] args)

您可以很好地調用您的main:

 java [whatever JVM args here] path.to.my.MainClass

即,沒有爭論。 分配一個沒有元素的數組。

因此,即使在這種情況下,您的第二個代碼也可以使用。

另外,如果在一個類中聲明至少一個構造函數,則不會生成默認的無參數構造函數。 因此,最后,您是“安全的”。

暫無
暫無

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

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