On Wed, Aug 12, 2009 at 11:04 PM, Reinier Zwitserloot <reini...@gmail.com>wrote:
> > Exactly. If java had pure operators (where the operator's meaning is > independent of the expressions on either side), then adding operator > overloading is a mess, but java's operator set is a hopeless mess. > Utterly hopeless. It makes no sense at all, and therefore the argument > that operator overloading is going to make things confusing makes no > sense either; the concept of operator overloading (especially if you > add sensible caveats, such as requiring strict type limits (both sides > should be the same type, and the operation must also return that type) > would be *far easier* to grok than the current meanings of operator > overloading. > > In case people take exception to my hypothesis that java's operators > are a screwed up grab bag of insanity, let me count the ways... > > (A) The / can mean EITHER integer division OR arithmetic division. > The types of the LHS and RHS decide. This is stupid. It's caused a lot > of pain because it's stupid. > > (B) The & operator is strictly binary and, and && is strictly logical > and. Exactly why is this different from the behaviour for the slash, > where two related but definitely not the same meanings have been > overloaded into one operator? While integral and arithmetic division > is screwed up all the time, I can't think of many ways in which you > could confuse logical and bitwise and! Think about it: Java has no > concept of truthy and falsy, and bitwise and cannot ever produce > booleans, and the concept of bitwise and/or/xor on 2 boolean values, > if it were allowed, would clearly be equal to the logical operators. > It's virtually impossible to write something that doesn't do what you > think it does, even if you don't know if the compiler has 2 different > meanings (logical vs. bitwise). > > (C) All operators in java are already overloaded; - can for example > mean unary minus, binary minus on ints, binary minus on longs, binary > minus on floats, and binary minus on doubles (but not binary minus on > shorts, bytes, or chars!). However, + is particularly egregious; it > can mean all those things AND it can mean string concatenation. String > concatenation isn't even commutative (commutative is: a + b has the > same meaning as b + a, which for string concat clearly isn't true, but > it is true for numeric addition). > > (D) All binary operators in java are type dependent (e.g. + is long > addition if it involves a long but not a string), but it is NOT > dependent on type positions. In other words, in "EXPR1 OPERATOR > EXPR2", the meaning of operator is the same as in "EXPR2 OPERATOR > EXPR1". In other words, 'new Object() + ""' is string concatenation, > because '"" + new Object()' is string concatenation. So far so good > (this is actually useful, and a common thorny issue with operator > overloading in other languages, where this almost invariably does not > hold, and a particular side decides the meaning. E.g. in scala, it's > the LHS, unless the operator ends in a colon, in which case it's the > RHS). However, this property *IS NOT ASSOCIATIVE*, which is just > screwed up. Consider: > > new Object() + "" > > is string concatenation, but this: > > new Object() + new Object() + "" > > isn't. It's a compiler error, because while binary operator meaning is > positionally independent, chains of operations are resolved as binary > applications from left to right. This doesn't make sense in > combination with positional independence. > > (E) byte, short, and char are special, in that they don't support any > operators. Instead, java will automatically widen them up to ints > (which does have operators). This creates screwed up situations: > > byte a = 10; > byte b = 20; > callMethod(a ^ b); > > will call the callMethod that takes an int, even if there's a > callMethod that takes a byte. This is utter magic to any java > programmer. Similarly, this: > > byte a = 10; > byte b = 20; > short c = a + b; > > will generate a 'possible loss of precision' error, eventhough this is > clearly bogus; the result of adding two bytes fits, by definition in a > short. On the other hand, this: > > int a = 10; > int b = 10; > int c = a + b; > > will NOT give you any warning, but in that case, you really *COULD* > have a possible loss of precision. The entire warning is a lie. > > (F) The biggest bunch of operator overloading haters, project coin, > jumped headfirst, with complete abandon, into extending the meaning of > [] for list and map access, both reading and setting. So far no one > has mentioned that this is operator overloading, and I'm too in love > with schadenfreude to bring it up in this early stage. > > > > My current plans for lombok in regards to operator overloading are > fairly simple. Either (A) it'll be for a hardcoded list of types only > (e.g. arithmetic and bitwise operations for BigInteger and BigDecimal, > and map/list indexed read access for java.util.List and Map, as well > as the google collections API and javolution), or (B) that plus > interfaces that you can override, but with the caveat that all types > are strictly congruent. E.g: the + operation can only be defined as T > + T = T - the two types on either side of the plus sign need to be the > same, and you must output your own type as well. This removes a lot of > the confusion and conveniently adds associative positional > independence, as long as you don't try to mix things with java's own > internal set of screwyness. > > > Are you really going to go to a corner and cry about that? Wuss! I said "talk about crying", you know as well as I do that crying is for P/L SQL:ers. > > > On Aug 12, 9:28 pm, Viktor Klang <viktor.kl...@gmail.com> wrote: > > On Wed, Aug 12, 2009 at 8:46 PM, Augusto <augusto.sellh...@gmail.com> > wrote: > > > > > On Aug 12, 1:23 pm, Reinier Zwitserloot <reini...@gmail.com> wrote: > > > > > > Incidentally, projectlombok.org's goals are pretty much that: A > > > > java.next for the rest of us. Closures, more literals, probably > > > > extension methods and operator overloading, properties, lots of > > > > boilerplate elimination, et voila. > > > > > Operator overloading? > > > > > Let me go to a corner and cry ... > > > > Use BigDecimal for complex arithmetics, then we can talk about crying. > > > > > > > > -- > > Viktor Klang > > > > Rogue Scala-head > > > > Blog: klangism.blogspot.com > > Twttr: viktorklang > > > -- Viktor Klang Rogue Scala-head Blog: klangism.blogspot.com Twttr: viktorklang --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "The Java Posse" group. To post to this group, send email to javaposse@googlegroups.com To unsubscribe from this group, send email to javaposse+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/javaposse?hl=en -~----------~----~----~----~------~----~------~--~---