2017-08-14 37 views
0

我目前正在研究一些反射的東西,我只是一個初學者。從類<? extends X>到X

我得到這個:

List<X> list; 
Set<Class<? extends X>> set; 

我想要做這樣的事情:

for (Class<? extends X> classx : set) list.add(classx); 

,但我無法找到如何實現任何事情。 有人可以幫我嗎?

+3

'X'和'類'是非常不同的類型。正如所寫,您至少需要使用反射來創建一個'Class '的新實例。當你有一個'Class ''時,你的問題是如何創建一個實例嗎? –

+0

[使用類名稱和調用構造函數創建實例]的可能副本(https://stackoverflow.com/questions/6094575/creating-an-instance-using-the-class-name-and-calling-constructor) –

回答

0

您無法使用該輸入數據實現此類行爲。 List<X>列表期望類X的實例,但您試圖添加類型爲Class<? extends X>的對象。 讓我們想象一下,類型X是數字(爲了簡單起見),我們有Double,Integer,Character等,Number的子代。 所以,你正在做的下一件事: 你想添加到Class<Integer>類型的對象列表,其中只能容納數字(不是Class<Integer>,Class<Double>等)。你能做的唯一的事,這是創建的Class<Integer>Class<Double>實例這種方式,使用反射:

List<X> list = //some values; 
Set<Class<? extends X>> set = //some values; 
for (Class<? extends X> classx : set) list.add(classx.newInstance()); 

但是,這是如此糟糕的決定,這樣的方式來使用反射。 也許你意味着什麼這樣的:

List<Class<X>> list = //some values; 
Set<Class<? extends X>> set = //some values; 
for (Class<? extends X> classx : set) list.add(classx); 

由於仍然 Class<X>是不一樣的Class<? extends X>。 但也許你的意思是這樣的:

List<X> list = //some values; 
Set<? extends X> set = = //some values; 
for (X elem : set) list.add(elem); 

最後一個看起來不錯,它應該工作。

+0

但我確實需要列表,因爲我需要在這些對象上調用一些方法。 擁有一套正是我想要得到的。 –

+0

@MaëlGrivot所以,讓我問一些問題。首先:你真的有Set >設置,也許你已經設置了設置?如果1個變體 - 首先你需要實例化你的類,因爲在Java變量類 someVar是類(我們稱之爲類對象)類型的對象,不同於類型的對象?擴展X.類對象有用於反射的方法(例如newInstance() - 它通過這個Class對象創建 - 在它的括號中指定的類型的對象)。 –

+0

是的,我有一個Set >,它包含一個列表擴展抽象類的類。 –

相關問題