Yes, the Java revolution is over. Java cannot evolve significantly - like the RIAA with their Britney Spears clones, it's too important to try anything really risky, and, as everyone knows, the really cool new features are always experiments by brand new languages. Simula (objects) was an experiment; Self (prototype based objects) likewise; same for ML (type checking against inferred types), Lisp (closures), whichever language introduced threads (I forget...).
Java too was an experiment. It's basic precepts - security, portability, safety, etc - are all things that can't be bolted onto any existing language. Likewise, anything new that comes out can't be bolted onto Java - and if they try, hoards of people will scream "call it something other than Java!".
I don't mean to pick on Java here - this phenomon is anything but specific to Java. Perl is struggling with this right now (perhaps you recognized the "call it something other than..." catchphrase). Other languages that pioneered ideas didn't stand on their own two feet but were amalgomated into other things (like Perl, which directly or indirectly steals features from all of those above languages). But sequals always make die hard fans nervous as sequals often tarnish a good name. In another scenario, Ralph Griswald made Icon after he made SNOBOL, and Icon never attained the notoriety SNOBOL did but plenty of people loved both languages and no one faulted Icon for existing. Following that line of thought, Sun can always reinvent themselves - or at least try - and call it something other than "Java" or even reinvent "Java" and risk upsetting people.
C# stole Java's thunder but it did it without introducing anything really truly new, or even assembling old features in a particularly interesting way as Java had (with the exception of inter-language binary linking which Borland had been doing with TurboPascal, TurboAssembler, and TurboC years ago). The fact that C# stole Java's thunder for purely selfish reasons is aggitating even to this writer who doesn't really care for Java.
On the other hand, Java brought the situation upon itself. People have been implementing generics for Java for years and selling them or giving them away. Java developers have been begging Sun for them - and Sun turned a deaf ear (or worse - their sham of a "community process"). Sun got their cake eaten because the egos of Java's creators and their notions of purity got in the way of what programmers were trying to do with Java. Ditto for compilers. gcc very badly wanted to solve this problem for Sun but Sun only ever threw monkey wrenches into the works. And we all remember Blackdown's port of Java to Linux, which they generously provided, only to be stabbed in the back by Sun who turned around, after asking them to do the port, and told them they couldn't distribute it. This was years ago before Linux was considered a serious platform but it speaks volumes about why Java's write-once-run-anywhere mission failed.
This is part of a larger pattern of Microsoft eating everyones lunch the moment they start to get cocky and take lunch for granted. Moral judgements aside, no one should be overly surprised this happened.
How's that quote go? Biologists have a special word for stability - it's called "dead". Java is stable. People want it to remain what it is, not try anything freaky they might have to back out of (J2EE's library bloat is bad enough). So Java will be eclipsed. It's only a matter of time. Even if C# doesn't do any more damage, another language will come along and do so (or something barely on the radar now will grow like nuts exactly like Python and PHP did).
Don't take this as gloating over Java's death either - I'm just reflecting on the natural cycle of things. My first love was BASIC (yeck), which I loved - I both clung to it emotionally and thoroughly enjoyed programming in it. The former was destructive but the latter turned out to be essential for any aspiring hacker. Hoardes of C programmers cling to C. C needs to get the heck out of the application space. C is causing vast amounts of damage due to buffer overflows and portability problems. Right now, the planet Earth's computing infrastructure is 99% tied to Microsoft Windows, Mac OS X, and Linux - programs written for Linux won't build on whatever comes after Linux because their idea of portability is to detect whether they're being built on Windows, OSX, Linux, and maybe FreeBSD if you're lucky. I still have piles of code around that only build on Ultrix or early SunOS. These morons thought they were writing portable code - but morons doing exactly the same thing think the same thing. This is the damage caused by people clinging to C. Clinging to Java might work right now but eventually it'll be a handicap just as clinging to C is - we just don't know why it'll be a handicap yet (though the Python, Perl, Ocaml, Ruby, etc people all have theories). Sooner or later, Java will show it's age.
My opinion, in a nutshell: Java programmers are, sooner or later, going to have to embrace whatever language is popular or else rebel. Rebelling is plausible (BASIC programmers, COBOL programmers, and Lisp programmers are all rebels but in very different ways and they've rebelled for different reasons - stupidity, traditionalism/pragmaticism, and idealism/pragmaticism respectively). However, future languages are likely to learn from Java just as Java learned from languages before it, and things either tolerable technically (like C#) or far superior (as Java eclipses C for most tasks) will come out and a Java programmer should be happy to make the leap.