| // Copyright (c) 2011, 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. |
| |
| import "package:expect/expect.dart"; |
| |
| // Checks that a method with an instantiated return type can override a method |
| // with a generic return type. |
| |
| typedef V RemoveFunctionType<K, V>(K key); |
| |
| class MapBase<K, V> { |
| K remove(K key) { |
| throw 'Must be implemented'; |
| } |
| |
| void tests() { |
| Expect.isTrue(this is MapBase<int, int>); |
| |
| // `remove` takes an argument which is covariant-by-class, so |
| // the tear-off has dynamic type `int Function(Object)`. |
| |
| Expect.isTrue(remove is RemoveFunctionType); |
| Expect.isTrue(remove is RemoveFunctionType<int, int>); |
| Expect.isTrue(remove is RemoveFunctionType<String, int>); |
| Expect.isTrue(remove is RemoveFunctionType<MapBase<int, int>, int>); |
| } |
| } |
| |
| class MethodOverrideTest extends MapBase<String, String> { |
| String remove(String key) { |
| throw 'Must be implemented'; |
| } |
| |
| void tests() { |
| Expect.isTrue(this is MethodOverrideTest); |
| Expect.isTrue(this is MapBase<String, String>); |
| |
| // `remove` takes an argument which is covariant-by-class because |
| // an overridden method does so, and hence the tear-off has dynamic |
| // type `String Function(Object)`; so does `super.remove`. |
| |
| Expect.isTrue(remove is RemoveFunctionType); |
| Expect.isTrue(remove is RemoveFunctionType<String, String>); |
| Expect.isTrue(remove is! RemoveFunctionType<int, int>); |
| Expect.isTrue(super.remove is RemoveFunctionType); |
| Expect.isTrue(super.remove is RemoveFunctionType<String, String>); |
| Expect.isTrue(super.remove is! RemoveFunctionType<int, int>); |
| } |
| } |
| |
| main() { |
| new MapBase<int, int>().tests(); |
| new MethodOverrideTest().tests(); |
| } |