2017-06-22 368 views
1

我有一個要求,類的屬性的類型是通用的,將決定運行時。因此,我想出了下面的類定義使用泛型爲Java類的屬性

public class Generics<T> { 

    T t1; 

    public void put(T t2){ 
     t1 = t2; 
    } 

} 

創建一個對象之前,我所知道的類型。因此我想知道如何實例化。我嘗試了以下,但它給編譯錯誤。什麼是正確的方式?

Object obj = getObjFromFactory() // obj can be type say A.class or B.class. I wish to get the class of obj and pass it to Generics 

Generics<obj.class> generics = new Generics<obj.class>(); 
+0

https://stackoverflow.com/documentation/java/92/generics/388/creating-a-generic-class#t=20170622092158177626 – JEY

+1

注意'泛型泛型'會創建一個_raw_類型,這意味着任何泛型檢查都將被停用。它也會是'new Generics ()',因爲類型無論如何都是類,所以不需要使用'Sample.class'。 – Thomas

+0

我認爲我們在這裏有一個XY問題。您無法在運行時決定Java中的通用類的類型。 Java泛型是編譯時構造,在運行時所有泛型都被擦除。因此,您需要告訴我們上下文,您正在使用什麼屬性以及需要在運行時確定哪些屬性,也許我們可以幫助您選擇除泛型以外的其他屬性。 – RealSkeptic

回答

1

既然你不知道類型,直到運行時你不能明確地命名,但你可以使用一個類型 - 參數,以配合不同部分的代碼,你可以肯定做參考同類型的類型不管它是什麼:

private <T> void myRutine(final Factory<T> factory) { 
    // ... 
    final T obj = factory.getObj(); 
    // ... 
    final Generics<T> generics = new Generics<>(); 
    // ... 
    generics.put(obj); 
    // ... 
} 

在上面喲代碼你在委託代碼確定T它可以。如果它不能它可能只是用?

Factory<?> f = codeToCreateFactory(); 
myRutine(f); 
3
Generics<Sample> generics = new Generics<>(); 

參見:Oracle Java Tutorials - Generics

+0

正確。你可能想補充的是,在Java 7之前它必須是'Generics generics = new Generics ();'作爲鑽石操作符在Java 7中引入。 –

+0

我更新了我的問題,請你檢查一下。我有一個基礎對象,我需要從中衍生出要傳遞給泛型的類 –

+0

您的getObjFromFactory()將需要成爲[泛型方法](https://docs.oracle.com/javase/tutorial/extra/泛型/ methods.html)。然後你可以做'泛型' generics = getObjFromFactory();'注意在類型參數中永遠不會有'.class',所以不要使用'.class'。另外,如果你在編譯時不知道類型,這是行不通的。 – Jesper

0

你這樣做同樣的方式與收藏

不喜歡這樣的:

List<Integer.class> myVarList = ...; 

List<Integer> myVarList = ...; 

所以你的情況

Generics<Sample> generics = new Generics<>(); 

或較舊版本的Java

Generics<Sample> generics = new Generics<Sample>(); 
+0

我更新了我的問題,請你檢查一下。我有一個基礎對象,我需要從中派生類傳遞給泛型。 –