0

情况如下:

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() 函数。基于规范。多于。

4

2 回答 2

0

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

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

或者:

AR<E> reader=new CR(fileAddr); //or AR<C>
于 2012-11-05T11:43:30.307 回答
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;
 }
}

(会有一堆异常需要处理……)

于 2012-11-05T11:50:58.397 回答