@redeclare가 재선언할 대상이 없는 멤버

@redeclare가 재선언할 대상이 없는 멤버 (redeclare_on_non_redeclaring_member)

이 문서는 Dart 분석기(analyzer)가 내는 redeclare_on_non_redeclaring_member 진단(diagnostic)을 설명하는 문서예요. extension type의 멤버에 @redeclare 애너테이션을 달았는데, 실제로 같은 이름의 멤버가 구현한 인터페이스에 없을 때 분석기가 알려 줘요. 어떤 상황에서 발생하고 어떻게 고치는지 함께 알아볼게요.

출처: redeclare_on_non_redeclaring_member

본문

진단 메시지

The {0} doesn't redeclare a {0} declared in a superinterface.

{0}은(는) 수퍼인터페이스에 선언된 {0}을(를) 재선언하는 게 아니에요.

설명

분석기는 extension type의 어떤 멤버가 @redeclare로 애너테이션되었는데, 구현한 인터페이스들 중 어디에도 같은 이름의 멤버가 없을 때 이 진단을 만들어 내요. @redeclare가 원래 '수퍼인터페이스의 멤버를 가려서 다시 선언한다'는 뜻이니까, 재선언할 대상이 없으면 애너테이션의 의미가 없어지거든요.

예시

다음 코드는 extension type E가 선언한 멤버 n@redeclare가 붙어 있는데, C에는 n이라는 이름의 멤버가 없기 때문에 이 진단을 만들어 내요.

import 'package:meta/meta.dart';

class C {
  void m() {}
}

extension type E(C c) implements C {
  @redeclare
  void n() {}
}

일반적인 해결 방법

애너테이션된 멤버의 이름이 맞다면, 애너테이션을 제거하면 돼요.

class C {
  void m() {}
}

extension type E(C c) implements C {
  void n() {}
}

만약 이 멤버가 구현한 인터페이스의 멤버를 대체하려는 목적이었다면, 애너테이션된 멤버의 이름을 대체하려는 멤버와 같게 바꿔 주세요.

import 'package:meta/meta.dart';

class C {
  void m() {}
}

extension type E(C c) implements C {
  @redeclare
  void m() {}
}

더 알아보기