次があるとします。
abstract class Item { public Item(){}}
abstract class ExtraItem extends Item { public ExtraItem(){}}
class A extends Item{ public A(){}}
class B extends Item{ public B(){}}
class C extends Item{ public C(){}}
class EA extends ExtraItem{ public A(){}}
class EB extends ExtraItem{ public B(){}}
class EC extends ExtraItem{ public C(){}}
このようなファクトリークラスを書きたいのですが、キャストはしません:
class Factory {
Item createItem(String className){
Class clazz = Class.forName(className);
return (Item) clazz.newInstance(); //I don't want here cast to Item
}
ExtraItem createExtraItem(String className){
Class<? extends ExtraItem> clazz = (Class<? extends ExtraItem>) Class.forName(className); // I don't want here cast to Extraitem
return clazz.newInstance();
}
}
上記のように書いてみます(もちろんキャスト付き):
@SuppressWarnings("unchecked")
public static <T extends Item> T createItem(String protocolType) {
try {
String className = protocolType;
Class<?> clazz = Class.forName(className);
return (T) clazz.newInstance();
} catch (Exception e) {
Log.e("ItemFactory", "Lack key \"" + protocolType + "\" in map: " + e.getLocalizedMessage());
}
return null;
}
しかし、ここで Class.cast() メソッドをどのように使用しますか? それはより良い方法ですか?