Java 如何将类型传递到func

Java 如何将类型传递到func,java,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<

情况如下:

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>{}
interface A{}//实体的接口
类B实现了一个{}//实体B
类C实现了一个{}//实体C
抽象类AR{}//通过文件生成E的列表,这将在构造函数之后完成。
类BR扩展了AR{}
类CR扩展了AR{}
现在我想保持:
地图数据//

函数。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;
 }
}  
List getList(String fileAddr)
{
if(data.containsKey(fileAddr))
返回data.get(fileAddr);
其他的
{
AR reader=new R(fileAddr);//通过此文件生成E的列表
列表值=reader.getValues();
data.put(fileAddr,值);
返回值;
}
}  
但这不起作用,而且不支持
newr(fileAddr)


那么如何实现getList()函数呢。基于上述规范。

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

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

AR读取器=新的CR(fileAddr)//或AR

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

解决此问题的一种方法是传入一个可以创建所需实例的factory对象

另一种方法是将参数类型的
对象作为参数传递,然后反射地创建实例;e、 g.类似这样的情况:

<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;
 }
}
List getList(字符串文件地址器,类rClass)
{
if(data.containsKey(fileAddr))
返回data.get(fileAddr);
其他的
{
Constructor=rClass.getConstructor(String.class);
R reader=ctor.newInstance(fileAddr);
列表值=reader.getValues();
data.put(fileAddr,值);
返回值;
}
}

(将有一系列异常需要处理…

是否通过类“声明”将“E”传递到此类?不能使用“new”关键字创建泛型类型:new R(…)在您的情况下,在Java中是非法的。getList是泛型方法,E作为getList的泛型类型传递。
<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;
 }
}