[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