// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// @dart=2.9
abstract class A<T> {
  void _method1(int a, int b, T c, T d);
  void _method2({int a, int b, T c, T d});
  void _method3(int a, T b);
  void _method4({int a, T b});
}

abstract class B {
  void _method1(int x, covariant int y, int z, covariant int w);
  void _method2({int a, covariant int b, int c, covariant int d});
  void _method3(covariant int x, int y);
  void _method4({covariant int a, int b});
}

abstract class C1 implements A<int>, B {}

abstract class C2 implements B, A<int> {}

class C3 implements A<int>, B {
  @override
  noSuchMethod(Invocation invocation) => null;
}

class C4 implements B, A<int> {
  @override
  noSuchMethod(Invocation invocation) => null;
}
