views:

129

answers:

3

This confuses me. The following compiles fine under Eclipse.

package com.example.gotchas;

public class GenericHelper1 {

 static <T> T fail() throws UnsupportedOperationException
 {
  throw new UnsupportedOperationException();
 } 

 /**
  * just calls fail()
  * @return something maybe
  */
 public boolean argh() { return fail(); }

 public static void main(String[] args) {
  // TODO Auto-generated method stub

 }

}

But if I try to do a clean build with ant, or at the command line with javac, I get this:

src\com\example\gotchas\GenericHelper1.java:14: type parameters of <T>T cannot be determined; no unique maximal instance
 exists for type variable T with upper bounds boolean,java.lang.Object
        public boolean argh() { return fail(); }
                                           ^
1 error

what gives, and how do I fix it?

A: 

Could it be that you are trying to return a primitive boolean rather than a Boolean?

I can't tell you why it works in Eclipse, but when I modify your argh method to return Boolean and compile using 1.6.0_16 it compiles just fine.

rayd09
+2  A: 

There are inconsistencies between the two compilers. I've found similar bugs, sometimes in Eclipse and sometimes in the JDK.

I'm not sure which is wrong in this case. The problem appears to be due to the combination of generics and auto-boxing.

In any case, if you specify the type parameter explicitly, instead of relying on type inference, it will compile:

public boolean argh() { 
  return GenericHelper.<Boolean>fail(); 
}
erickson
+1  A: 

This is a bug:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6302954

CDSO1