2017-06-22 362 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

我更新了我的问题,请你检查一下。我有一个基础对象,我需要从中派生类传递给泛型。 –