| // Copyright (c) 2018, 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 |
| |
| import "package:expect/expect.dart"; |
| |
| abstract class A<T> { |
| // This is ok because type inference will ensure that in C, A and M are |
| // instantiated with the same T. |
| T f(T x) => x; //# 01: ok |
| } |
| |
| class B {} |
| |
| abstract class M1 implements A<B> {} |
| |
| mixin M2<T> on A<T> { |
| T f(T x) => x; |
| T g(T x) => x; |
| Type h() => T; |
| } |
| |
| // Inferred as `class C extends Object with M1, M2<B>` |
| class C extends Object with M1, M2 {} |
| |
| main() { |
| C c = new C(); |
| |
| // M is instantiated with B, so C.g has type (B) -> B. |
| B Function(B) x = c.g; //# 02: ok |
| Null Function(Null) x = c.g; //# 03: compile-time error |
| Object Function(Object) x = c.g; //# 04: compile-time error |
| |
| // And verify that the runtime system has the right type for the type |
| // parameter |
| Expect.equals(c.h(), B); //# 05: ok |
| } |