Для первого вы можете использовать его как:
Set<MyClass> set = thing.getMyList();
Set<MyDerivedClass> set = thing.getMyList();
Set<?> set = thing.getMyList();
Set<? extends MyClass> set = thing.getMyList();
Set<? extends MyDerivedClass> set = thing.getMyList();
Во-вторых, вы более ограничены:
Set<?> set = thing.getMyList();
Set<? extends MyClass> set = thing.getMyList();
Как вы ожидаете реализовать первое? Второе плохо, потому что заставляет код клиента использовать подстановочные знаки.