2013-03-19 68 views
3

如果我有一個接口I,並實現它的一些類,是有可能注入的陣列I[]List<I>成豆?我發現可以使用<list></list>來完成List<Object>,但我想在此處參數化我的列表 - 要麼是I春:注射某種類型的數組或列表成豆

列表/數組中元素的數量是固定的,並在運行時間之前確定。

感謝提前:-)

回答

0

那是不可能的,因爲在編譯時JAVA類型擦除來實現任何反饋。 JAVA泛型僅在編譯時可用,並且確保類型安全。在運行時只剩下對象(引用)。

可以做,以確保類型安全(但仍運行時)的唯一的事情就是有什麼類型的數組,並使用彈簧<陣列> < /陣列>或<列表> < /列表>標籤來填充數據。然後在運行時,當你嘗試使用字符串填充Integer []時,你會得到一個異常。

如果您使用泛型,你可以已經設置<整數>和運行時間結束了集<字符串>因爲上述類型擦除。

+0

這篇文章暗示,否則...... http://stackoverflow.com/a/2416145/1154145。但我不確定這是否適用於接口。 – nattyddubbs 2013-03-19 20:02:35

+0

with 您可以定義值的解釋方式,但不是類型安全。類型擦除:http://docs.oracle.com/javase/tutorial/java/generics/erasure.html – emd 2013-03-19 20:09:38

0

如果你想要基於通用類型的動態自動佈線,那麼由於類型擦除而不需要。如果你只是想連線定義爲List<String>類型(或其他)的列表,沒有什麼阻止你這樣做,例如:

應用程序上下文:

<util:list id="theList"> 
    <value>a</value> 
    <value>b</value> 
</util:list> 

Java類:

@Resource(name = "theList") 
List<String> theList; 

雖然這不會提供類型安全性。

+0

錯誤,因爲沒有什麼東西從「列表」列表字段(或方法參數)聲明中「擦除」。類型擦除*不*這個答案表明它是什麼;只需查看[Reflection API](https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/reflect/package-summary.html),特別是'GenericDeclaration'和'ParameterizedType '。 – 2015-08-23 16:58:39

2

我春天3.1有可能注入它作爲:

@Inject 
List<I> list; 

其中I是你的界面(但它應該是具體的)。

或者你可以使用的Spring Java配置(@Configuration)生產(@Bean)評選名單,並使用Qualifier@Named它們注入。

你也可以定義類型化的命名列表爲here

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:util="http://www.springframework.org/schema/util" 
xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd"> 


<util:list id="myList" value-type="java.lang.String"> 
    <value>foo</value> 
    <value>bar</value> 
</util:list>