まず、私はJavaにとって本当の新しいことだと言わなければなりません。だから私の質問がばかげていると謝っていますが、これまでのところ解決策を見つけることができませんでした...抽象サブクラスを動的にインスタンス化する
抽象クラスのサブクラスを動的にインスタンス化したいと思います。私が持っていないとして(コンパイル時ではなく、私のIDEに私にエラー(IllegalAccessExceptionが及びないInstantiationExceptionを)与えているので、一部
AbstractCommand command = commandClass.getClass().newInstance();
を行う場合
この
はコードpublic class CommandMap implements Handler.Callback
{
private HashMap <Integer, Class<? extends AbstractCommand> > __commandHashMap;
protected CommandMap()
{
__commandHashMap = new HashMap<Integer, Class<? extends AbstractCommand>>();
}
/**
* Map an ID to a command
* @param what Id used in the Message sent
* @param command Command to be executed
*/
public void mapWhat(Integer what, Class<? extends AbstractCommand> command)
{
if (!__commandHashMap.containsKey(what))
{
__commandHashMap.put(what, command);
}
}
/**
* Unmap the id/command pair
* @param what Id
*/
public void unmapWhat(Integer what)
{
if (__commandHashMap.containsKey(what))
{
__commandHashMap.remove(what);
}
}
public boolean handleMessage (Message message)
{
// call the corresponding command
if (__commandHashMap.containsKey(message.what))
{
Class<? extends AbstractCommand> commandClass = __commandHashMap.get(message.what);
AbstractCommand command = commandClass.getClass().newInstance();
}
return true; // for now
}
}
です試してみました)
だからこのようなtry/catchで囲みます。
public boolean handleMessage (Message message)
{
// call the corresponding command
if (__commandHashMap.containsKey(message.what))
{
Class<? extends AbstractCommand> commandClass = __commandHashMap.get(message.what);
try
{
AbstractCommand command = commandClass.getClass().newInstance();
}
catch (IllegalAccessException e)
{
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
catch (InstantiationException e)
{
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
return true; // for now
}
しかし、それは、(newInstance()によって送られた)タイプClassが、抽象的な型AbstractCommandではないことを私に伝えます。
AbstractCommand command = (AbstractCommand) commandClass.getClass().newInstance();
をやっAbstractCommandにクラスをキャストしようとするとそれはクラスがAbstractCommandにキャストすることができないことを私に伝えます。
私は何が間違っているのだろうかと思っていましたか?
お手数をおかけしますが、ありがとうございます。
getClass()メソッドが実際のサブクラスクラスを取得していますか? commandClass.newInstance()は、サブクラスの代わりに抽象クラスのコンストラクタを呼び出そうとしていますか? あなたの助けを借りて、とにかく、私はこれを試してみます – nolazybits
'commandClass"クラスのどちらでも 'commandClass.newInstance()'がデフォルトコンストラクタを呼び出します。私。 'commandClass = FooCommand.class'の場合、' commandClass.newInstance() 'は' new FooCommand() 'とまったく同じです。理にかなっている? –
それでは、それはもはや不平を言うことはありません... Thxこれについて...上記の質問に答えてもらえれば、 Thxもう一度... – nolazybits