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>

関数。ブローは、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 言語はそれを許しません。

この問題を回避する 1 つの方法は、必要なインスタンスを作成できるファクトリ オブジェクトを渡すことです。

これを回避する別の方法は、パラメーター型の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 に答える