👋
ジェネリクスで分岐処理をする
ジェネリクスで分岐処理をしたくなったのでメモ。
void main() {
test<ConcreteA>();
}
abstract class Abstract {}
class ConcreteA implements Abstract {}
class ConcreteB implements Abstract {}
void test<T extends Abstract>() {
switch (T) {
case ConcreteA:
print('処理A');
case ConcreteB:
print('処理B');
default:
print('デフォルト処理');
}
}
どのような場合に使うか
ConcreteA, ConcreteBに対応するクラスとして、ConcreteA2, ConcreteB2みたいなクラスがある場合に、ConcreteAに対応するConcreateA2のインスタンスが欲しいみたいなとき
abstract class Abstract2 {}
class ConcreteA2 implements Abstract2 {}
class ConcreteB2 implements Abstract2 {}
ConcreteAのインスタンスがすでにある場合は、createメソッドを定義すればいい
abstract class Abstract {
Abstract2 create();
}
しかし、Concreteインスタンスが手に入る前に、Abstract2クラスのインスタンスが欲しい場合には、ジェネリクスで分岐させるしかないか
Abstract2? create<T extends Abstract>() {
switch (T) {
case ConcreteA:
return ConcreteA2();
case ConcreteB:
return ConcreteB2();
default:
return null;
}
}
Discussion