Generics problem

Ulf Zibis Ulf.Zibis at gmx.de
Fri Jul 9 06:37:04 PDT 2010


See following code:


/**
  * @author Ulf Zibis, Cologne CoSoCo.de
  */
public class GenericsProblem {

     private static abstract class Entry<V,E extends Entry<V,E>> 
implements Comparable<E> {
         V value;
         int count = 0;

         Entry(V value) {
             this.value = value;
         }

         public int compareTo(E other) {
             return count != other.count ? count > other.count ? -1 : 1 : 0;
         }
     }

     private static class Word extends Entry<String,Word> {

         private Word(String str) {
             super(str);
         }
     }

     private static abstract class Phrase<P extends Phrase<P>> extends 
Entry<int[],P> {
         int prefixLength;

         Phrase(int[] codes, int prefixLength) {
             super(codes);
             this.prefixLength = prefixLength;
         }

// <P extends Phrase<P>> int matchDepth(P other) {
         int matchDepth(Phrase<? extends Phrase> other) {
             for (int i=0, l=Math.min(value.length, other.value.length); ; )
                 if (value[i] != other.value[i] || ++i == l)
                     return i;
         }
     }

     private static class UName extends Phrase<UName> {
         private final int cp;

         UName(int cp, String name) {
             super(wordCodes(name), 1);
             count = 1;
             this.cp = cp;
         }

         private static int[] wordCodes(String name) {
             String[] words = name.split("[ \\\\-]");
             int [] codes = new int[words.length];
             for (int i=0; i<words.length; i++)
                 codes[i] = words[i].length();
             return codes;
         }

         public int compareTo(UName other) {
             int m = matchDepth(other), l1, l2, c1, c2;
             return m == Math.min(l1 = value.length, l2 = 
other.value.length) && l1 != l2 ? l1 < l2 ? -1 : 1 : // (3b) OK!
                 (c1=value[m]) != (c2=other.value[m]) ? c1 < c2 ? -1 : 1 
: 0;
         }
     }

     static <V,E extends Entry<V,E>> int sizeOf1(E e) { // number of 
effective elements
         if (e instanceof Word) // compile error ???
             return ((Word)e).value.length();
         else
             return ((Phrase<? extends Phrase>)e).value.length - 
((Phrase<? extends Phrase>)e).prefixLength + 1;
//        return e instanceof Word ? ((Word)e).value.length() :
//                ((Phrase<? extends Phrase>)e).value.length - 
((Phrase<? extends Phrase>)e).prefixLength + 1;
     }
}


I get following error:

C:\Projects\Java_Bugs\JDK-7\...\GenericsProblem.java:69: inconvertible types
         if (e instanceof Word) // compile error ???
   required: Word
   found:    E
   where E,V are type-variables:
     E extends Entry<V,E> declared in method <V,E>sizeOf1(E)
     V extends Object declared in method <V,E>sizeOf1(E)
C:\Projects\Java_Bugs\JDK-7\...\GenericsProblem.java:70: inconvertible types
C:\Projects\Java_Bugs\JDK-7\...\GenericsProblem.java:70: inconvertible types
             return ((Word)e).value.length();
   required: Word
   found:    E
   where E,V are type-variables:
     E extends Entry<V,E> declared in method <V,E>sizeOf1(E)
     V extends Object declared in method <V,E>sizeOf1(E)
2 errors


I don't understand this because:
     E extends Entry<V,E>
and
     Word extends Entry<String,Word>

Any Ideas?

-Ulf






More information about the compiler-dev mailing list