violet icon indicating copy to clipboard operation
violet copied to clipboard

dynamic type 인자로 받고 있는 메서드 개선

Open violet-dev opened this issue 4 months ago • 1 comments

// 1. 봉인된 클래스 (Sealed Class)를 정의하여 상속받는 타입을 제한합니다.
sealed class StringOrInt {} 

// 2. String과 int를 감싸는 랩퍼 클래스를 정의합니다.
class MyString implements StringOrInt {
  final String value;
  MyString(this.value);
}

class MyInt implements StringOrInt {
  final int value;
  MyInt(this.value);
}

// 3. 제네릭 T의 상한을 StringOrInt로 제한합니다.
class MyContainer<T extends StringOrInt> {
  final T data;
  MyContainer(this.data);

  void printType() {
    // 내부에서는 'switch'를 사용하여 컴파일 타임에 모든 케이스를 강제할 수 있습니다.
    switch (data) {
      case MyString s:
        print('String data: ${s.value}');
        break;
      case MyInt i:
        print('Int data: ${i.value}');
        break;
    }
  }
}

void main() {
  // ✅ 성공: StringOrInt의 서브타입만 허용
  var sContainer = MyContainer(MyString('hello'));
  sContainer.printType(); // String data: hello

  var iContainer = MyContainer(MyInt(123));
  iContainer.printType(); // Int data: Int data: 123

  // ❌ 에러 발생: double은 StringOrInt의 서브타입이 아니므로 컴파일 에러
  // var dContainer = MyContainer(double.parse('1.0')); 
}

violet-dev avatar Oct 04 '25 11:10 violet-dev

https://github.com/project-violet/violet/pull/789

violet-dev avatar Oct 04 '25 11:10 violet-dev