[Proposal]

Dave Dave_member at pathlink.com
Sun Jun 18 13:05:55 PDT 2006


Sjoerd van Leent wrote:
> Dave wrote:
>>
>> public class Test
>> {
>>     public static void main(String args[])
>>     {
>>         Integer i = 100;
>>         System.out.println(sqr(i));
>>         int j = 1000;
>>         System.out.println(sqr(j));
>>     }
>>     public static <T> T sqr(T x)
>>     {
>>         return x * x;
>>     }
>> }
>>
>> However, I get this when I compile:
>>
>> Test.java:10: operator * cannot be applied to T,T
>>                 return x * x;
>>
>> ?
>>
>> Thanks,
>>
>> - Dave
> 
> 
> This is correct behaviour. You are now stating:
> 
> T must be of type Object. Type object doesn't have the * operator 
> implemented. Even extending it from Number won't help, since the * 
> operator doesn't work on class instances, only on primitives. To get it 
> work you need quite a hack:
> 
> package generic.test;
> 
> import sun.reflect.generics.reflectiveObjects.NotImplementedException;
> 
> public class Test {
>     public static void main(String args[]) {
>         Integer i = 100;
>         System.out.println(sqr(i));
>         int j = 1000;
>         System.out.println(sqr(j));
>     }
>     public static <T extends Number> T sqr(T x) {
>         if(x instanceof Integer) {
>             return (T)(Number)new Integer(x.intValue() * x.intValue());
>         } else if(x instanceof Byte) {
>             return (T)(Number)new Byte((byte)(x.byteValue() * 
> x.byteValue()));
>         } else if(x instanceof Long) {
>             return (T)(Number)new Long(x.longValue() * x.longValue());
>         } else if(x instanceof Double) {
>             return (T)(Number)new Double(x.doubleValue() * 
> x.doubleValue());
>         } else if(x instanceof Float) {
>             return (T)(Number)new Float(x.floatValue() * x.floatValue());
>         } else {
>             throw new NotImplementedException();
>         }
>     }
> }
> 
> Which is, if you ask me, not the best way of using Generics, well, I 
> didn't invent them in Java, and it shows that it is really syntactic sugar.
> 
> Regards,
> Sjoerd

Yikes! :)



More information about the Digitalmars-d mailing list