서브타입이어야 합니다

서브타입이어야 합니다

The type '{0}' must be a subtype of '{1}' for '{2}'.

이 진단은 타입 인자가 기대하는 슈퍼타입 관계를 만족하지 못할 때 나타나요. 주로 dart:ffi 함수 포인터 관련 호출에서 발생해요.

출처: must_be_a_subtype

본문

이 애널라이저 진단은 두 가지 경우에 발생해요.

  • Pointer.fromFunction 호출이나 NativeCallable 생성자에서, 타입 인자(명시적이든 추론된 것이든)가 메서드의 첫 번째 인자로 전달된 함수의 타입의 슈퍼타입이 아닐 때.
  • DynamicLibrary.lookupFunction 호출에서, 첫 번째 타입 인자가 두 번째 타입 인자의 슈퍼타입이 아닐 때.

FFI에 대한 자세한 내용은 C interop using dart:ffi 문서를 참고하면 좋아요.

예시

다음 코드는 함수 f의 타입(String Function(int))이 타입 인자 T(Int8 Function(Int8))의 서브타입이 아니기 때문에 이 진단이 나와요.

import 'dart:ffi';

typedef T = Int8 Function(Int8);

double f(double i) => i;

void g() {
  Pointer.fromFunction<T>(f, 5.0);
}

일반적인 해결 방법

어느 쪽이 맞는지에 따라 다른 고쳐주면 돼요.

1) 함수가 맞다면 타입 인자를 그에 맞게 바꿔요.

import 'dart:ffi';

typedef T = Float Function(Float);

double f(double i) => i;

void g() {
  Pointer.fromFunction<T>(f, 5.0);
}

2) 타입 인자가 맞다면 함수를 그에 맞게 바꿔요.

import 'dart:ffi';

typedef T = Int8 Function(Int8);

int f(int i) => i;

void g() {
  Pointer.fromFunction<T>(f, 5);
}

더 알아보기