Update with Dart 2.0 core library unimplemented implementations (#406)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 157d52b..7faf3b8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,12 @@
 #### 0.27.0-dev
 
+   * BREAKING CHANGE: all classes that implement `Iterable`, `List`, `Map`,
+     `Queue`, `Set`, or `Timer` now implement stubs of upcoming Dart 2.0
+     methods. Any class that reimplements these classes also needs new method
+     implementations. The classes with these breaking changes include:
+     `HashBiMap`, `DelegatingIterable`, `DelegatingList`,
+     `DelegatingMap`,`DelegatingQueue`, `DelegatingSet`, `LinkedLruHashMap`,
+     `TreeSet`, and `AvlTreeSet`.
    * Fix: Use FIFO ordering in `FakeAsync`. PR
      [#265](https://github.com/google/quiver-dart/pull/265)
 
diff --git a/lib/src/collection/bimap.dart b/lib/src/collection/bimap.dart
index ece246b..8ff32c7 100644
--- a/lib/src/collection/bimap.dart
+++ b/lib/src/collection/bimap.dart
@@ -70,6 +70,31 @@
   int get length => _map.length;
   Iterable<V> get values => _inverse.keys;
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  void addEntries(Iterable<Object> entries) {
+    // Change Iterable<Object> to Iterable<MapEntry<K, V>> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError("addEntries");
+  }
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  Map<K2, V2> cast<K2, V2>() {
+    throw new UnimplementedError("cast");
+  }
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_getter
+  Iterable<Null> get entries {
+    // Change Iterable<Null> to Iterable<MapEntry<K, V>> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError("entries");
+  }
+
   BiMap<V, K> get inverse {
     if (_cached == null) {
       _cached = new HashBiMap._from(_inverse, _map);
@@ -77,6 +102,15 @@
     return _cached;
   }
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  Map<K2, V2> map<K2, V2>(Object transform(K key, V value)) {
+    // Change Object to MapEntry<K2, V2> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError("map");
+  }
+
   V putIfAbsent(K key, V ifAbsent()) {
     var value = _map[key];
     if (value != null) return value;
@@ -89,6 +123,34 @@
     return _map.remove(key);
   }
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  void removeWhere(bool test(K key, V value)) {
+    throw new UnimplementedError("removeWhere");
+  }
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  Map<K2, V2> retype<K2, V2>() {
+    throw new UnimplementedError("retype");
+  }
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  V update(K key, V update(V value), {V ifAbsent()}) {
+    throw new UnimplementedError("update");
+  }
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  void updateAll(V update(K key, V value)) {
+    throw new UnimplementedError("updateAll");
+  }
+
   void clear() {
     _map.clear();
     _inverse.clear();
diff --git a/lib/src/collection/delegates/iterable.dart b/lib/src/collection/delegates/iterable.dart
index 3eb508d..5fc1e8b 100644
--- a/lib/src/collection/delegates/iterable.dart
+++ b/lib/src/collection/delegates/iterable.dart
@@ -29,6 +29,13 @@
 
   bool any(bool test(E element)) => delegate.any(test);
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  Iterable<T> cast<T>() {
+    throw new UnimplementedError("cast");
+  }
+
   bool contains(Object element) => delegate.contains(element);
 
   E elementAt(int index) => delegate.elementAt(index);
@@ -45,6 +52,13 @@
   T fold<T>(T initialValue, T combine(T previousValue, E element)) =>
       delegate.fold(initialValue, combine);
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  Iterable<E> followedBy(Iterable<E> other) {
+    throw new UnimplementedError("followedBy");
+  }
+
   void forEach(void f(E element)) => delegate.forEach(f);
 
   bool get isEmpty => delegate.isEmpty;
@@ -66,9 +80,19 @@
 
   E reduce(E combine(E value, E element)) => delegate.reduce(combine);
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  Iterable<T> retype<T>() {
+    throw new UnimplementedError("retype");
+  }
+
   E get single => delegate.single;
 
-  E singleWhere(bool test(E element)) => delegate.singleWhere(test);
+  E singleWhere(bool test(E element), {E orElse()}) {
+    if (orElse != null) throw new UnimplementedError("singleWhere:orElse");
+    return delegate.singleWhere(test);
+  }
 
   Iterable<E> skip(int n) => delegate.skip(n);
 
@@ -83,4 +107,11 @@
   Set<E> toSet() => delegate.toSet();
 
   Iterable<E> where(bool test(E element)) => delegate.where(test);
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  Iterable<T> whereType<T>() {
+    throw new UnimplementedError("whereType");
+  }
 }
diff --git a/lib/src/collection/delegates/list.dart b/lib/src/collection/delegates/list.dart
index 864ff86..38fdae7 100644
--- a/lib/src/collection/delegates/list.dart
+++ b/lib/src/collection/delegates/list.dart
@@ -34,29 +34,80 @@
     delegate[index] = value;
   }
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  List<E> operator +(List<E> other) {
+    throw new UnimplementedError("+");
+  }
+
   void add(E value) => delegate.add(value);
 
   void addAll(Iterable<E> iterable) => delegate.addAll(iterable);
 
   Map<int, E> asMap() => delegate.asMap();
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  DelegatingList<T> cast<T>() {
+    throw new UnimplementedError("cast");
+  }
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  DelegatingList<T> retype<T>() {
+    throw new UnimplementedError("retype");
+  }
+
   void clear() => delegate.clear();
 
   void fillRange(int start, int end, [E fillValue]) =>
       delegate.fillRange(start, end, fillValue);
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_setter
+  void set first(E element) {
+    if (this.isEmpty) throw new RangeError.index(0, this);
+    this[0] = element;
+  }
+
   Iterable<E> getRange(int start, int end) => delegate.getRange(start, end);
 
   int indexOf(E element, [int start = 0]) => delegate.indexOf(element, start);
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  int indexWhere(bool test(E element), [int start = 0]) {
+    throw new UnimplementedError("indexWhere");
+  }
+
   void insert(int index, E element) => delegate.insert(index, element);
 
   void insertAll(int index, Iterable<E> iterable) =>
       delegate.insertAll(index, iterable);
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_setter
+  void set last(E element) {
+    if (this.isEmpty) throw new RangeError.index(0, this);
+    this[this.length - 1] = element;
+  }
+
   int lastIndexOf(E element, [int start]) =>
       delegate.lastIndexOf(element, start);
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  int lastIndexWhere(bool test(E element), [int start]) {
+    throw new UnimplementedError("lastIndexWhere");
+  }
+
   void set length(int newLength) {
     delegate.length = newLength;
   }
diff --git a/lib/src/collection/delegates/map.dart b/lib/src/collection/delegates/map.dart
index 1e66c59..8bf04a1 100644
--- a/lib/src/collection/delegates/map.dart
+++ b/lib/src/collection/delegates/map.dart
@@ -35,12 +35,37 @@
 
   void addAll(Map<K, V> other) => delegate.addAll(other);
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  void addEntries(Iterable<Object> entries) {
+    // Change Iterable<Object> to Iterable<MapEntry<K, V>> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError("addEntries");
+  }
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  Map<K2, V2> cast<K2, V2>() {
+    throw new UnimplementedError("cast");
+  }
+
   void clear() => delegate.clear();
 
   bool containsKey(Object key) => delegate.containsKey(key);
 
   bool containsValue(Object value) => delegate.containsValue(value);
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_getter
+  Iterable<Null> get entries {
+    // Change Iterable<Null> to Iterable<MapEntry<K, V>> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError("entries");
+  }
+
   void forEach(void f(K key, V value)) => delegate.forEach(f);
 
   bool get isEmpty => delegate.isEmpty;
@@ -51,9 +76,46 @@
 
   int get length => delegate.length;
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  Map<K2, V2> map<K2, V2>(Object transform(K key, V value)) {
+    // Change Object to MapEntry<K2, V2> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError("map");
+  }
+
   V putIfAbsent(K key, V ifAbsent()) => delegate.putIfAbsent(key, ifAbsent);
 
   V remove(Object key) => delegate.remove(key);
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  void removeWhere(bool test(K key, V value)) {
+    throw new UnimplementedError("removeWhere");
+  }
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  Map<K2, V2> retype<K2, V2>() {
+    throw new UnimplementedError("retype");
+  }
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  V update(K key, V update(V value), {V ifAbsent()}) {
+    throw new UnimplementedError("update");
+  }
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  void updateAll(V update(K key, V value)) {
+    throw new UnimplementedError("updateAll");
+  }
+
   Iterable<V> get values => delegate.values;
 }
diff --git a/lib/src/collection/delegates/queue.dart b/lib/src/collection/delegates/queue.dart
index 58688f7..ddf1058 100644
--- a/lib/src/collection/delegates/queue.dart
+++ b/lib/src/collection/delegates/queue.dart
@@ -36,6 +36,13 @@
 
   void addLast(E value) => delegate.addLast(value);
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  DelegatingQueue<T> cast<T>() {
+    throw new UnimplementedError("cast");
+  }
+
   void clear() => delegate.clear();
 
   bool remove(Object object) => delegate.remove(object);
@@ -47,4 +54,11 @@
   void removeWhere(bool test(E element)) => delegate.removeWhere(test);
 
   void retainWhere(bool test(E element)) => delegate.retainWhere(test);
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  DelegatingQueue<T> retype<T>() {
+    throw new UnimplementedError("retype");
+  }
 }
diff --git a/lib/src/collection/delegates/set.dart b/lib/src/collection/delegates/set.dart
index 9362e80..08fb4b8 100644
--- a/lib/src/collection/delegates/set.dart
+++ b/lib/src/collection/delegates/set.dart
@@ -32,6 +32,20 @@
 
   void addAll(Iterable<E> elements) => delegate.addAll(elements);
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  DelegatingSet<T> cast<T>() {
+    throw new UnimplementedError("cast");
+  }
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  DelegatingSet<T> retype<T>() {
+    throw new UnimplementedError("retype");
+  }
+
   void clear() => delegate.clear();
 
   bool containsAll(Iterable<Object> other) => delegate.containsAll(other);
diff --git a/lib/src/collection/lru_map.dart b/lib/src/collection/lru_map.dart
index 237d098..a4ec5a7 100644
--- a/lib/src/collection/lru_map.dart
+++ b/lib/src/collection/lru_map.dart
@@ -80,6 +80,22 @@
   void addAll(Map<K, V> other) => other.forEach((k, v) => this[k] = v);
 
   @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  void addEntries(Iterable<Object> entries) {
+    // Change Iterable<Object> to Iterable<MapEntry<K, V>> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError("addEntries");
+  }
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  LinkedLruHashMap<K2, V2> cast<K2, V2>() {
+    throw new UnimplementedError("cast");
+  }
+
+  @override
   void clear() {
     _entries.clear();
     _head = _tail = null;
@@ -91,6 +107,15 @@
   @override
   bool containsValue(Object value) => values.contains(value);
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_getter
+  Iterable<Null> get entries {
+    // Change Iterable<Null> to Iterable<MapEntry<K, V>> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError("entries");
+  }
+
   /// Applies [action] to each key-value pair of the map in order of MRU to
   /// LRU.
   ///
@@ -132,6 +157,15 @@
   Iterable<V> get values => _iterable().map((e) => e.value);
 
   @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  Map<K2, V2> map<K2, V2>(Object transform(K key, V value)) {
+    // Change Object to MapEntry<K2, V2> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError("map");
+  }
+
+  @override
   int get maximumSize => _maximumSize;
 
   @override
@@ -213,8 +247,36 @@
   }
 
   @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  void removeWhere(bool test(K key, V value)) {
+    throw new UnimplementedError("removeWhere");
+  }
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  LinkedLruHashMap<K2, V2> retype<K2, V2>() {
+    throw new UnimplementedError("retype");
+  }
+
+  @override
   String toString() => Maps.mapToString(this);
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  V update(K key, V update(V value), {V ifAbsent()}) {
+    throw new UnimplementedError("update");
+  }
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  void updateAll(V update(K key, V value)) {
+    throw new UnimplementedError("updateAll");
+  }
+
   /// Moves [entry] to the MRU position, shifting the linked list if necessary.
   void _promoteEntry(_LinkedEntry<K, V> entry) {
     // If this entry is already in the MRU position we are done.
diff --git a/lib/src/collection/multimap.dart b/lib/src/collection/multimap.dart
index 4046a49..3b6271f 100644
--- a/lib/src/collection/multimap.dart
+++ b/lib/src/collection/multimap.dart
@@ -293,6 +293,68 @@
   int get length => _multimap.length;
   C remove(Object key) => _multimap.removeAll(key);
   Iterable<C> get values => _multimap._groupedValues;
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  Map<K2, V2> cast<K2, V2>() {
+    throw new UnimplementedError("cast");
+  }
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  Map<K2, V2> retype<K2, V2>() {
+    throw new UnimplementedError("retype");
+  }
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_getter
+  Iterable<Null> get entries {
+    // Change Iterable<Null> to Iterable<MapEntry<K, V>> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError("entries");
+  }
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  void addEntries(Iterable<Object> entries) {
+    // Change Iterable<Object> to Iterable<MapEntry<K, V>> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError("addEntries");
+  }
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  Map<K2, V2> map<K2, V2>(Object transform(K key, C value)) {
+    // Change Object to MapEntry<K2, V2> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError("map");
+  }
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  V update(K key, C update(C value), {C ifAbsent()}) {
+    throw new UnimplementedError("update");
+  }
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  void updateAll(C update(K key, C value)) {
+    throw new UnimplementedError("updateAll");
+  }
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  void removeWhere(bool test(K key, C value)) {
+    throw new UnimplementedError("removeWhere");
+  }
 }
 
 /// Iterable wrapper that syncs to an underlying map.
@@ -325,6 +387,13 @@
     return _delegate.any(test);
   }
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  Iterable<T> cast<T>() {
+    throw new UnimplementedError("cast");
+  }
+
   bool contains(Object element) {
     _syncDelegate();
     return _delegate.contains(element);
@@ -360,6 +429,13 @@
     return _delegate.fold(initialValue, combine);
   }
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  Iterable<V> followedBy(Iterable<V> other) {
+    throw new UnimplementedError("followedBy");
+  }
+
   void forEach(void f(V element)) {
     _syncDelegate();
     _delegate.forEach(f);
@@ -410,12 +486,20 @@
     return _delegate.reduce(combine);
   }
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  Iterable<T> retype<T>() {
+    throw new UnimplementedError("retype");
+  }
+
   V get single {
     _syncDelegate();
     return _delegate.single;
   }
 
-  V singleWhere(bool test(V element)) {
+  V singleWhere(bool test(V element), {V orElse()}) {
+    if (orElse != null) throw new UnimplementedError("singleWhere:orElse");
     _syncDelegate();
     return _delegate.singleWhere(test);
   }
@@ -459,6 +543,13 @@
     _syncDelegate();
     return _delegate.where(test);
   }
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  Iterable<T> whereType<T>() {
+    throw new UnimplementedError("whereType");
+  }
 }
 
 class _WrappedList<K, V> extends _WrappedIterable<K, V, List<V>>
@@ -473,6 +564,13 @@
     _delegate[index] = value;
   }
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  List<V> operator +(List<V> other) {
+    throw new UnimplementedError("+");
+  }
+
   void add(V value) {
     _syncDelegate();
     var wasEmpty = _delegate.isEmpty;
@@ -492,6 +590,13 @@
     return _delegate.asMap();
   }
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  List<T> cast<T>() {
+    throw new UnimplementedError("cast");
+  }
+
   void clear() {
     _syncDelegate();
     _delegate.clear();
@@ -503,6 +608,14 @@
     _delegate.fillRange(start, end, fillValue);
   }
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_setter
+  void set first(V value) {
+    if (this.isEmpty) throw new RangeError.index(0, this);
+    this[0] = value;
+  }
+
   Iterable<V> getRange(int start, int end) {
     _syncDelegate();
     return _delegate.getRange(start, end);
@@ -513,6 +626,13 @@
     return _delegate.indexOf(element, start);
   }
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  int indexWhere(bool test(V element), [int start = 0]) {
+    throw new UnimplementedError("indexWhere");
+  }
+
   void insert(int index, V element) {
     _syncDelegate();
     var wasEmpty = _delegate.isEmpty;
@@ -527,11 +647,26 @@
     if (wasEmpty) _addToMap();
   }
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_setter
+  void set last(V value) {
+    if (this.isEmpty) throw new RangeError.index(0, this);
+    this[this.length - 1] = value;
+  }
+
   int lastIndexOf(V element, [int start]) {
     _syncDelegate();
     return _delegate.lastIndexOf(element, start);
   }
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  int lastIndexWhere(bool test(V element), [int start]) {
+    throw new UnimplementedError("lastIndexWhere");
+  }
+
   void set length(int newLength) {
     _syncDelegate();
     var wasEmpty = _delegate.isEmpty;
@@ -584,6 +719,13 @@
     if (_delegate.isEmpty) _map.remove(_key);
   }
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  List<T> retype<T>() {
+    throw new UnimplementedError("retype");
+  }
+
   Iterable<V> get reversed {
     _syncDelegate();
     return _delegate.reversed;
@@ -634,6 +776,13 @@
     if (wasEmpty) _addToMap();
   }
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  Set<T> cast<T>() {
+    throw new UnimplementedError("cast");
+  }
+
   void clear() {
     _syncDelegate();
     _delegate.clear();
@@ -691,6 +840,13 @@
     if (_delegate.isEmpty) _map.remove(_key);
   }
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  Set<T> retype<T>() {
+    throw new UnimplementedError("retype");
+  }
+
   Set<V> union(Set<V> other) {
     _syncDelegate();
     return _delegate.union(other);
diff --git a/lib/src/collection/treeset.dart b/lib/src/collection/treeset.dart
index 6375a21..6181865 100644
--- a/lib/src/collection/treeset.dart
+++ b/lib/src/collection/treeset.dart
@@ -51,6 +51,14 @@
   /// if missing.  See [TreeSearch].
   V nearest(V object, {TreeSearch nearestOption: TreeSearch.NEAREST});
 
+  @override
+  // ignore: override_on_non_overriding_method
+  Set<T> cast<T>();
+
+  @override
+  // ignore: override_on_non_overriding_method
+  Set<T> retype<T>();
+
   // TODO: toString or not toString, that is the question.
 }
 
@@ -376,6 +384,13 @@
     return modified;
   }
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  AvlTreeSet<T> cast<T>() {
+    throw new UnimplementedError("cast");
+  }
+
   void clear() {
     _length = 0;
     _root = null;
@@ -599,6 +614,13 @@
     addAll(chosen);
   }
 
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_method
+  Set<T> retype<T>() {
+    throw new UnimplementedError("retype");
+  }
+
   /// See [Set.removeWhere]
   void removeWhere(bool test(V element)) {
     List<V> damned = [];
diff --git a/lib/testing/src/async/fake_async.dart b/lib/testing/src/async/fake_async.dart
index afa6dda..c25aad8 100644
--- a/lib/testing/src/async/fake_async.dart
+++ b/lib/testing/src/async/fake_async.dart
@@ -285,4 +285,11 @@
   bool get isActive => _time._hasTimer(this);
 
   cancel() => _time._cancelTimer(this);
+
+  @override
+  // TODO: Dart 2.0 requires this method to be implemented.
+  // ignore: override_on_non_overriding_getter
+  int get tick {
+    throw new UnimplementedError("tick");
+  }
 }