使用泛型作为Java类的属性

时间:2017-06-22 09:20:50

标签: java generics

我有一个要求,即类的属性类型是通用的,并且将决定运行时。因此我提出了以下类定义

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>();

3 个答案:

答案 0 :(得分:3)

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

请参阅:Oracle Java Tutorials - Generics

答案 1 :(得分: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);

答案 2 :(得分:0)

您使用与集合相同的方式

不喜欢这样:

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

但是

List<Integer> myVarList = ...;

所以在你的情况下

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

或旧的Java版本

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