如何将类型传递给func

时间:2012-11-05 11:23:42

标签: java

情况如下:

interface A{}//interface for entities
class B implements A{}//entity B 
class C implements A{}//entity C 

abstract class AR<E extends A>{}//generate list of E via a file,this will be done after the construct func.
class BR extends AR<B>{}
class CR extends AR<C>{}

现在我想维持: Map<String,List<A>> data;//<filepath+filename, list of entities in file>

功能。 blow将根据fileAddr返回列表:

<E extends A,R extends AR<E>> List<A> getList(String fileAddr)
{
 if(data.containsKey(fileAddr))
  return data.get(fileAddr);
 else
 {
  AR<E> reader=new R(fileAddr);//generate a list of E via this file
  List<E> values=reader.getValues();
  data.put(fileAddr,values);
  return values;
 }
}  

但这不起作用,并且不支持new R(fileAddr)

那么如何实现getList()函数。根据规范。上方。

2 个答案:

答案 0 :(得分:0)

该行应替换为实际的类,例如:

AR<E> reader=new BR(fileAddr); //or AR<B>

或:

AR<E> reader=new CR(fileAddr); //or AR<C>

答案 1 :(得分:0)

您无法使用new生成类型参数的实例。技术原因是类型信息在getList执行时已被删除。无论如何,Java语言不允许它。

解决问题的一种方法是传入可以创建所需实例的工厂对象。

另一种方法是将参数类型的Class对象作为参数传递,然后反射地创建实例;例如像这样的东西:

<E extends A,R extends AR<E>> List<A> getList(String fileAddr, Class<R> rClass)
{
 if(data.containsKey(fileAddr))
  return data.get(fileAddr);
 else
 {
  Constructor<R> ctor = rClass.getConstructor(String.class);
  R reader=ctor.newInstance(fileAddr);
  List<E> values=reader.getValues();
  data.put(fileAddr,values);
  return values;
 }
}

(将有一堆例外处理...)