👋

ジェネリクスで分岐処理をする

2024/09/12に公開

ジェネリクスで分岐処理をしたくなったのでメモ。

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