blob: ca56a845e6236a0843d5c92741c7338bf08c1035 [file] [log] [blame]
// Copyright (c) 2019, 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.
/// @assertion The extension type parameter can also occur as a parameter type
/// for the method.
///
/// Example:
///
/// extension TypedEquals<T> {
/// bool equals(T value) => this == value;
/// }
///
/// Using such an extension as:
///
/// Object o = ...;
/// String s = ...;
/// print(s.equals(o)); // Compile-time type error.
///
/// will fail. While we could make it work by inferring [T] as [Object], we
/// don't. We infer [T] only based on the receiver type, and therefore [T] is
/// [String], and [o] is not a valid argument (at least not when we remove
/// implicit downcasts).
/// @description Check that compile time error is not thrown when method type
/// parameter is OK.
/// @author iarkh@unipro.ru
import "../../Utils/expect.dart";
Object getObject() => new Object();
String getString() => "OK";
extension TypedEquals<T> on T {
bool equals(T value) => this == value;
}
main() {
String s = getString();
Object o = getObject();
Expect.isFalse(o.equals(s));
}