初始化变量。我不知道他们的类型[java]

时间:2011-07-16 15:25:42

标签: java generics

class pair<U,V>{
U first;
V second;
public pair() {
    first = new U(); //error
    second = new V(); //error
}   
public pair(U f,V s){
    first = f;
    second = s;
}
}

要求:班级 找到:类型参数

是否可以用其他方式使用U / V类型的(不带参数)构造函数初始化first / second

2 个答案:

答案 0 :(得分:8)

由于type erasure,Java通常不允许这样做。您可以指定类型为Class<U>Class<V>的构造函数参数,您可以为其传递给定类型参数的具体类类型(即Integer.classString.class for {{ 1}}和<Integer>)。

也可以使用字节码级反射来提取类型,但是非常复杂,并且它并不总是适用于所有情况。如果向下滚动this article,您可以找到使其成为可能的示例。为方便起见,我在下面贴了它。

<String>

编辑:回复评论:

static public Type getType(final Class<?> klass, final int pos) {
    // obtain anonymous, if any, class for 'this' instance
    final Type superclass = klass.getGenericSuperclass();

    // test if an anonymous class was employed during the call
    if ( !(superclass instanceof Class) ) {
        throw new RuntimeException("This instance should belong to an anonymous class");
    }

    // obtain RTTI of all generic parameters
    final Type[] types = ((ParameterizedType) superclass).getActualTypeArguments();

    // test if enough generic parameters were passed
    if ( pos < types.length ) {
        throw RuntimeException(String.format("Could not find generic parameter #%d because only %d parameters were passed", pos, types.length));
    }

    // return the type descriptor of the requested generic parameter
    return types[pos];
}

答案 1 :(得分:1)

不,你不能,这些类型在Java中被删除。因此,您应该将构造移动到呼叫站点。