java.util.Observable but with generics to avoid casts
Pick a convention for your curly brackets/indentation and stick with it. You code has all of the following:


Brackets included, one-lined statement
Brackets omitted, one-lined statement
New line after opening bracket, closing bracket on same line.
New line after opening bracket, closing bracket on different line.
Un-indented code inside brackets.
Padding spaces to vertically aligning opening brackets (with multiple different vertical lines being padded to).
Single space padding opening brackets.
Blank line before closing bracket.


The Java convention is:

public synchronized boolean add(final Observer&lt;? super T&gt; o) {
   return !this.observers.contains(o) &amp;&amp; observers.add(o);
}


It is best to always include curly brackets even when they could be omitted. If you start with an if that does not include brackets and then need to add a second line, forgetting to would have the second line execute unconditionally.



It is safer to synchronize on a private instance variable than on the class instance. You have no control over what someone does with the instance of your class. Maybe they think it would be a good idea to use it to synchronize some other code. Now you have two different pieces of code using the same lock instance that might be result in a deadlock because they are not coordinated properly. A private lock variable guarantees that this can't happen.



You have to synchronize all accesses to observers. countObservers() could be called while you are adding or removing an observer.



Don't create aliases for your methods. It will only lead to confusion if there are multiple ways to do the same things.



observersSet is not a Set Don't make the argument name appear as if it is expecting one. If you do want it to be a set (you might since you are checking for duplicates in add()), then change the type from Collection to Set. If you need observers to be called in the order in which they were added, LinkedHashSet satisfies this requirement. If you accept any Collection when creating the instance, there is nothing to prevent the collection from already containing a duplicate.