情况如下:
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()函数。根据规范。上方。
答案 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;
}
}
(将有一堆例外处理...)