code: private static void getAssignableTypes( JClass t, Set<JClass> s ) {
          if(!s.add(t))
              return;
          
          // TODO
          
  //        if (t.fullName().equals(Equals.class.getName()) ||
  //        		t.fullName().equals(HashCode.class.getName()) ||
  //        		t.fullName().equals(ToString.class.getName()) ||
  //        		t.fullName().equals(CopyTo.class.getName())
  //        		)
          
          // add its raw type
          s.add(t.erasure());
  
          // if this type is added for the first time,
          // recursively process the super class.
          JClass _super = t._extends();
          if(_super!=null)
              getAssignableTypes(_super,s);
          
          // recursively process all implemented interfaces
          Iterator<JClass> itr = t._implements();
          while(itr.hasNext())
          {
              getAssignableTypes(itr.next(),s);
          }
      }
docs: Returns the set of all classes/interfaces that a given type
  implements/extends, including itself.
  
  For example, if you pass java.io.FilterInputStream, then the returned
  set will contain java.lang.Object, java.lang.InputStream, and
  java.lang.FilterInputStream.