Я некоторое время бил головой об этом и думал, что, может быть, некоторые свежие глаза увидят эту проблему; спасибо за ваше время.
import java.util.*;
class Tbin<T> extends ArrayList<T> {}
class TbinList<T> extends ArrayList<Tbin<T>> {}
class Base {}
class Derived extends Base {}
public class Test {
  public static void main(String[] args) {
    ArrayList<Tbin<? extends Base>> test = new ArrayList<>();
    test.add(new Tbin<Derived>());
    TbinList<? extends Base> test2 = new TbinList<>();
    test2.add(new Tbin<Derived>());
  }
}
Использование Java 8. Мне кажется, что прямое создание контейнера в test эквивалентно контейнеру в test2, но компилятор говорит:
Test.java:15: error: no suitable method found for add(Tbin<Derived>)
    test2.add(new Tbin<Derived>());
         ^
Как написать Tbin и TbinList, чтобы последняя строка была приемлемой?
Обратите внимание, что на самом деле я добавляю типизированный Tbin, поэтому я указал Tbin<Derived> в последней строке.