diff --git a/tools/droiddoc/src/MethodInfo.java b/tools/droiddoc/src/MethodInfo.java
index bded88b..3211038 100644
--- a/tools/droiddoc/src/MethodInfo.java
+++ b/tools/droiddoc/src/MethodInfo.java
@@ -25,9 +25,9 @@
             return a.name().compareTo(b.name());
         }
     };
-    
+
     private class InlineTags implements InheritedTags
-    { 
+    {
         public TagInfo[] tags()
         {
             return comment().tags();
@@ -42,7 +42,7 @@
             }
         }
     }
-    
+
     private static void addInterfaces(ClassInfo[] ifaces, ArrayList<ClassInfo> queue)
     {
         for (ClassInfo i: ifaces) {
@@ -79,7 +79,7 @@
         }
         return null;
     }
-    
+
     private static void addRealInterfaces(ClassInfo[] ifaces, ArrayList<ClassInfo> queue)
     {
         for (ClassInfo i: ifaces) {
@@ -92,7 +92,7 @@
             addInterfaces(i.realInterfaces(), queue);
         }
     }
-    
+
     public MethodInfo findRealOverriddenMethod(String name, String signature, HashSet notStrippable) {
         if (mReturnType == null) {
         // ctor
@@ -103,7 +103,7 @@
         }
 
         ArrayList<ClassInfo> queue = new ArrayList<ClassInfo>();
-        if (containingClass().realSuperclass() != null && 
+        if (containingClass().realSuperclass() != null &&
             containingClass().realSuperclass().isAbstract()) {
             queue.add(containingClass());
         }
@@ -121,7 +121,7 @@
         }
         return null;
     }
-    
+
     public MethodInfo findSuperclassImplementation(HashSet notStrippable) {
         if (mReturnType == null) {
             // ctor
@@ -138,7 +138,7 @@
         }
 
         ArrayList<ClassInfo> queue = new ArrayList<ClassInfo>();
-        if (containingClass().realSuperclass() != null && 
+        if (containingClass().realSuperclass() != null &&
                 containingClass().realSuperclass().isAbstract()) {
             queue.add(containingClass());
         }
@@ -154,7 +154,7 @@
         }
         return null;
     }
-    
+
     public ClassInfo findRealOverriddenClass(String name, String signature) {
         if (mReturnType == null) {
         // ctor
@@ -165,7 +165,7 @@
         }
 
         ArrayList<ClassInfo> queue = new ArrayList<ClassInfo>();
-        if (containingClass().realSuperclass() != null && 
+        if (containingClass().realSuperclass() != null &&
             containingClass().realSuperclass().isAbstract()) {
             queue.add(containingClass());
         }
@@ -199,7 +199,7 @@
             }
         }
     }
-    
+
     private class ReturnTags implements InheritedTags {
         public TagInfo[] tags() {
             return comment().returnTags();
@@ -213,7 +213,7 @@
             }
         }
     }
-    
+
     public boolean isDeprecated() {
         boolean deprecated = false;
         if (!mDeprecatedKnown) {
@@ -237,7 +237,7 @@
         }
         return mIsDeprecated;
     }
-    
+
     public TypeInfo[] getTypeParameters(){
         return mTypeParameters;
     }
@@ -274,7 +274,7 @@
 
         // The underlying MethodDoc for an interface's declared methods winds up being marked
         // non-abstract.  Correct that here by looking at the immediate-parent class, and marking
-        // this method abstract if it is an unimplemented interface method. 
+        // this method abstract if it is an unimplemented interface method.
         if (containingClass.isInterface()) {
             isAbstract = true;
         }
@@ -448,7 +448,7 @@
                             + tag.parameterName() + "'");
                 }
             }
-             
+
             // get our parent's tags to fill in the blanks
             MethodInfo overridden = this.findOverriddenMethod(name(), signature());
             if (overridden != null) {
@@ -508,7 +508,7 @@
     {
         return mParameters;
     }
-    
+
 
     public boolean matchesParams(String[] params, String[] dimensions)
     {
@@ -589,6 +589,7 @@
         return result;
     }
 
+    @Override
     public boolean isExecutable()
     {
         return true;
@@ -617,21 +618,23 @@
     {
         return mDefaultAnnotationElementValue;
     }
-    
+
     public void setVarargs(boolean set){
         mIsVarargs = set;
     }
     public boolean isVarArgs(){
       return mIsVarargs;
     }
+
+    @Override
     public String toString(){
       return this.name();
     }
-    
+
     public void setReason(String reason) {
         mReasonOpened = reason;
     }
-    
+
     public String getReason() {
         return mReasonOpened;
     }
