如何将参数化的Class对象用作方法参数?
class A<T>
{
public A(Class<T> c)
{
}
void main()
{
A<String> a1 = new A<String>(String.class); // OK
A<List<String>> a2 = new A<List<String>>(List<String>.class); // error
A<List<String>> a3 = new A<List<String>>(Class<List<String>>); // error
}
}
为什么我要这样做,你可能会问?我有一个参数化类,其类型是另一个参数化类,其构造函数需要其他类类型作为参数。我知道运行时类没有关于它们的类型参数的信息,但这不应该阻止我在编译时这样做。我似乎应该能够指定List<String>.class
这样的类型。还有其他语法吗?
以下是我的实际用例:
public class Bunch<B>
{
Class<B> type;
public Bunch(Class<B> type)
{
this.type = type;
}
public static class MyBunch<M> extends Bunch<List<M>>
{
Class<M> individualType;
// This constructor has redundant information.
public MyBunch(Class<M> individualType, Class<List<M>> listType)
{
super(listType);
this.individualType = individualType;
}
// I would prefer this constructor.
public MyBunch(Class<M> individualType)
{
super( /* What do I put here? */ );
this.individualType = individualType;
}
}
}
这可能吗?
答案 0 :(得分:0)
刚演员怎么样?
super((Class<List<M>>)List.class);
类文字不会包含您想要的类型参数。
答案 1 :(得分:0)
请记住,你不会在运行时将List作为一个类,正确的方法可能是使用TypeToken,正如BalusC告诉你的那样。如果没有TypeToken,则无法转换为List,但您可以创建如下内容:
public static class MyBunch2<List_M extends List<M>, M> extends Bunch<List_M>
{
Class<M> individualType;
@SuppressWarnings("unchecked")
public MyBunch2(Class<M> individualType)
{
super((Class<List_M>) List.class);
this.individualType = individualType;
}
}
由于List_M extends List<M>
这不像你想要的那样是类型安全的,但也许还不错。创建实例将像编写
MyBunch2<List<String>, String> a = new MyBunch2<List<String>, String>(String.class);
但您可以使用工厂方法
进行改进public static <M2> MyBunch2<List<M2>, M2> of(Class<M2> individualType){
return new MyBunch2<List<M2>, M2>(individualType);
}
然后写
MyBunch2<List<String>, String> b = MyBunch2.of(String.class);
如果您正在使用eclipse,代码帮助将帮助您编写丑陋的类MyBunch2,String&gt;
当然,在运行时,this.type将是java.util.List,而不是java.util.List 要做到正确,请转到TypeToken。
---延续---
你甚至可以制作另一个课程
public static class MyBunch3<M> extends MyBunch2<List<M>, M>
{
public MyBunch3(Class<M> individualType) {
super(individualType);
}
}
然后创建实例
MyBunch3<String> c = new MyBunch3<String>(String.class);
必须有一种方法可以在一个班级中做到这一点......但我无法弄明白