Java sealed classes and exhaustive pattern matching

(neilmadden.blog)

117 points | by hnisjafx40 7 hours ago ago

91 comments

  • shepherdjerred 3 hours ago

    I love how far Java has come. I still prefer TypeScript since I do a lot of frontend work and prefer to use the same language across the stack.

    With the said, you can do exhaustive pattern matching in TypeScript! https://github.com/gvergnaud/ts-pattern

  • armchairhacker 6 hours ago

    Java also has recursive patterns and (maybe still in preview) literal patterns: `switch (x) { case A(B(true, var c)) -> f(c); }`

  • timshel2 5 hours ago

    Scala punching the air rn

    • mlinksva an hour ago

      No affiliation with either, but I don't think Java and Scala are punching at each other, and they're both doing great. Needless to say Java has continued to exceed expectations and given its huge role in the world, that's worth [handwave very huge number] in consumer welfare. Scala has evolved the last several years to again become perhaps the most interesting big-ish application language, eg see Odersky's recent https://scaladays.org/session/opening-session-keynote/ and https://dl.acm.org/doi/10.1145/3786335.3813127

    • AdrenalinMd 4 hours ago

      I still write Scala. But not sure for how long. I swear, it's such a joy to write code in Scala.

      It's like French poetry.. So much elegance. An no effect system BS. Just like Martin Odersky intended it to be!

      • rhdunn a minute ago

        I like a lot of Scala but dislike implicits. I feel like it is the wrong abstraction in that it is similar to implicit type conversion in C/C++, making it harder to reason about what the code is doing and navigating to the types/methods being called.

        I prefer extension methods for what Scala implicits do [1], [2]. The only part that is lacking with extension methods is to be able to extend a type to implement an interface, e.g. Comparable, but you can create extension methods that return anonymous objects [3].

        [1] https://kotlinlang.org/docs/extensions.html#anonymous-extens...

        [2] https://learn.microsoft.com/en-us/dotnet/csharp/programming-...

        [3] https://discuss.kotlinlang.org/t/extensions-function-to-impl...

      • theanonymousone 3 hours ago

        >it's such a joy to write code in Scala.

        Yes, but also a bit of a torture to read code in it..

      • therealdrag0 18 minutes ago

        Agree. Really enjoy it—without type effects libs.

      • tentacleuno 4 hours ago

        Curious what you meant about the effect system BS?

        • jmalicki 3 hours ago

          I'm assuming they mean Scala doesn't have the tortured Haskell IO monad.

          • pdpi 2 hours ago

            Scala doesn't have an IO monad by default, but ZIO, CatsEffect, and probably others are fairly popular in at least some parts of the community. IMO it's kind of the worst of both worlds (all the complexity, none of the guarantees), but it's definitely there.

          • troupo 2 hours ago

            Oh. It does. https://github.com/zio/zio

            Thankfully, not in the core language :)

            • ackfoobar 2 hours ago

              This is perhaps why the comment added "Just like Martin Odersky intended it to be!"

              There are just too many ways to use Scala, and everyone thinks they're doing it "idiomatically".

    • dozerly 4 hours ago

      Sigh, I so very miss writing Scala.

  • panny an hour ago

    I don't think you need those switch defaults with the sealed types. I didn't check with a compiler, but I think those are unnecessary.

    • thfuran 43 minutes ago

      The switches with defaults are both switching over a String with only literal cases. That can't be exhaustive without a default, and switch expressions must be exhaustive.

  • Larrikin 6 hours ago

    Java continues to try and catch up to Kotlin https://kotlinlang.org/docs/sealed-classes.html

    I didn't mind Java when the comparisons were to C++, Ruby, and Python. I can not find a reason to go back after Scala (which seemed to fail due to being indiscriminate) and especially Kotlin

    • pron 5 hours ago

      A hoarder may have much more furniture than I do, but if I buy a sofa it doesn't mean I'm trying to catch up to the hoarder (who has five). Java isn't trying to catch up for the simple reason that we don't want it to have all the features Kotlin does; in fact, we're trying very hard to avoid that (not to mention that we have yet to adopt a single Kotlin feature; our features usually take a different form, even though Kotlin, Java, and many other languages often rely on the same inspiration, which is usually the ML language). That's because some languages aim to be feature-rich while others aim to be more minimal. Both are likely to accumulate features over time, but at very different rates (we'll hold off on features for years until we're satisfied that their value justifies the added complexity to the language, as keeping that relatively low is very important to us).

      If you like a richer language, the Java platform offers you options, but many people prefer smaller languages (the number of Java Platform developers who use the Java language has remained pretty much at a constant ~90% for the past 15 or more years), but we're aware that a non-tiny minority of developers prefer richer languages, and so we accommodate them, too. Either way, 95% of the JDK is runtime (standard library and the JVM) and tooling, and you'll enjoy it regardless of which frontend language you prefer.

      • fallingbananna 2 hours ago

        The analogy is very sensible, but I would like to add that Kotlin isn't really hoardning features in the same way Scala did.

        Compared to Scala, C++, or even Typescript and C#, Kotlin feels a like a well thought out minimal modern language (as minimal as you can be, while still providing conviniences that we have grown to expect like nullability checks, or data classes).

        (*Except coroutines, I feel like Java is achieving that goal waaay better with virtual threads and structured concurrency than Kotlin did with "forever experimental" API that is full of footguns and lacks any observability.)

        • gf000 an hour ago

          Kotlin is absolutely massive, and they often add n small features instead of a single more complicated one, so I don't think the comparision to Scala fits.

          Funnily enough kotlin added some rushed, delivered syntax sugar in the form of `when` and java just came and added proper pattern matching with algebraic data types and exhaustiveness checking into the platform itself, making it better than the guest language at its own game. Meanwhile I never felt this "landing page growing" mindset with Scala.

        • derriz 2 hours ago

          This is subjective of course but for me Kotlin is certainly not minimal - I'd put it closer to C# than Java in terms of features. Typescript and Java feel like far smaller languages. Of course, C++ is in a class of its own in terms of anti-minimalism.

        • speed_spread 37 minutes ago

          I find Kotlin to be full footguns in general, letting you do stuff because 'why the hell not'. It feels like the Kotlin designers just wanted to show off, without considering that many of the resulting code patterns would be terrible.

      • CrimsonRain 2 hours ago

        You're driving java feature set with great expertise. It is hard to complain about it.

        I know it is not a technically marvelous thing, it's not a high priority either...but the only thing I'd want differently is lot more syntactic sugar that reduces common boilerplates/actions/patterns to simple one liners.

        However, with AI writing most of the code now, I now doubt the importance.

      • bmacho 4 hours ago

        > Both are likely to accumulate features over time, but at very different rates (we'll hold off on features for years until we're satisfied that their value justifies the added complexity to the language, as keeping that relatively low is very important to us).

        This strategy will still navigate Java into a random local optimum like it happened with other languages (that value backward compatibility), just more slowly. The greedy algorithm does that. Even if you do it slowly and you are extra careful that each step indeed betters the language.

        • pron 3 hours ago

          Everything comes to an end eventually, and there's no strategy to avoiding it. But not trying to adapt to real changes in the environment could certainly be a recipe to hasten that end. And yes, we do really try and make sure that any change we make is more than worth it.

          But if in 2026 Java is the third or second most popular language in the world overall and the #1 choice for large applications that are performance-sensitive and/or need to be maintainable, but is it possible that in 20 years, despite our best efforts, Java will decline sharply, perhaps even to the point of being only as popular as, say, Go is today? Sure.

        • valzam 4 hours ago

          Of course, invoking 'there are two kinds of languages: one that people complain about and one that nobody uses', there are two kinds of language designs: one that is perfectly consistent and one that has had contact with the real world.

        • oldsecondhand 4 hours ago

          The issue is that it's hard to predict how certain features will be misused and even harder to remove a harmful feature from a language. That's why Java goes slow. (Although I think there's too much pussyfooting around string interpolation. But I also think too much type inference makes the code harder to read.)

        • throwaway7783 2 hours ago

          Not always. See PostgreSQL as a counter example.

      • troupo 2 hours ago

        > A hoarder may have much more furniture than I do, but if I buy a sofa it doesn't mean I'm trying to catch up to the hoarder

        A few years back the same argument was phrased as "we don't adopt features from lesser languages" or something to that effect. Since then Java has been busy adopting those features at an accelerated pace.

        > If you like a richer language, the Java platform offers you options, but many people prefer smaller languages

        And Java is no longer a smaller language. Because artificial purity for misguided reasons hurts the language. And thankfully most people in Java have finally realized it.

        • pron an hour ago

          > A few years back the same argument was phrased as "we don't adopt features from lesser languages" or something to that effect. Since then Java has been busy adopting those features at an accelerated pace.

          Except it wasn't, because adopting ML features, especially lambdas and generics, were discussed in the Java team even before Java was released.

          Also, the "accelerated pace" is only compared to a dry spell where development stagnated not by choice but by Sun's problems. We had a pace we liked, then we were forced to slow down, and now we're back to the pace we like again.

          Also, it has always been a stated strategy to focus on innovation more in the runtime than in the language (Gosling called it "a wolf in sheep's clothing"). Java has always aimed to innovate in compiler technology, garbage collection, and telemetry as fast as it could, and we innovate faster than most in these areas.

          > And Java is no longer a smaller language.

          No longer smaller than what? We aim to keep the language relatively small, i.e. smaller than mainstream languages that are more eager to add features. So Java is bigger than Go, but it's smaller than C# or Kotlin or Rust, and is roughly comparable to TS or Swift in its "size".

          • troupo 9 minutes ago

            > Except it wasn't, because

            Except it was. It was you saying this. [1]

            And yes, those ML features, and many other features, were adopted by other languages, and faster, than Java. Now you're suddenly saying "we're aware that a non-tiny minority of developers prefer richer languages, and so we accommodate them, too" and "oh yes, we've been thinking of these features since 1991".

            > No longer smaller than what?

            Than whatever your ever-changing definition is. Java, thankfully, is no longer a small/smaller language, and is rapidly adopting actual useful features, including those from lesser products.

            Unfortunately it may be held back by people still thinking that a language should not be useful in any way, shape or form. Thankfully, you're being dragged into modern world kicking and screaming. Maybe in 10 more years Java will catch up with the rest of the world (as I said, it's been catching up quite rapidly).

            ---

            [1] https://news.ycombinator.com/item?id=28985688

            "our goal isn't to adopt the strategy of less successful products, but to forge our own"

      • dtech 4 hours ago

        > not to mention that we have yet to adopt a single Kotlin feature; our features usually take a different form, even though Kotlin, Java, and many other languages often rely on the same inspiration, which is usually the ML language

        This seems disingenuous at best, or it's a symptom that I've noticed as a user more often that your JDK team seems to have blinders on and dismisses/ignores most other languages even if feature have proven themselves 10 times over.

        There's several features Java added or is trying to add, usually 5-10+ years later than Kotlin, and that's ignoring Scala:

        * Local type inference

        * Switch expressions

        * Records, although I found them barely usable because there is no copy() method or with-ers

        * String templates unsuccessfully

        * A very stripped down version of smart-casting with switch pattern matching

        I'm sure there's tech-debt and esoteric compatibility concerns which make evolving Java hard, but from a developer's perspective it's just glacial to evolve and the result is weaksauce.

        • pron 3 hours ago

          Local type inference, records, and switch expressions (alongside lambdas and generics) are all ML features, as every language designer will tell you (and Java did them quite differently from Kotlin). All of them, by the way, were well known to Java's original designer in the nineties, it's just that they thought it will be a while until mainstream programmers are ready for them, so their adoption in Java is best postponed.

          BTW, even if you're not aware of ML's extraordinary influence on most programming languages, surely you're aware there are competitors to Java with analogous features that are far bigger than Kotlin.

          As for string templates, our intent is not to have a feature simiar to what Kotlin offers. We obviously look at all languages regardless of popularity, but in that case, as we did in the case of virtual threads or records, we'll probably say, no, that's not what we want, to Kotlin's approach (even the Preview that we pulled was nothing like Kotlin's approach).

          > I'm sure there's tech-debt and esoteric compatibility concerns which make evolving Java hard

          Backward compatibility is rarely a hindrance at all. People just talk about it a lot because most organisations consistently say that backward compatibility is much more important to them than any language feature, but it's not all that hard to maintain.

          > but from a developer's perspective it's just glacial to evolve and the result is weaksauce.

          I find that statement hard to reconcile with the fact that the only languages as popular as Java or more are JS/TS and Python, while all the languages that are not "weaksauce" from "a developer's perspective" are doing far, far worse than Java. There has never, ever, been any sort of consensus among developers on the right set of features, and there have always been developers who prefer more features and those who prefer less. It's perfectly fine to be on one side or the other or even to say, "yes, I'm in the minority, but I still think I'm right", but I find it strange to claim to represent "the developer's perspective" when your preferences are mostly associated with languages that are doing worse rather than better.

          • matsemann 2 hours ago

            I get your point, but Kotlin is still what made many of these specific features widely known to java developers, and accelerated the push from devs to get similar things into java.

            Mind you, I like that java has taken its time to get the features right. Of course, java has had the advantage of enhancing the jvm while adding the features, where Kotlin had to work around the jvm in some cases (like green threads vs coroutines).

            So I prefer javas version of many of the of the more modern things (but do miss Kotlin's lambdas and vast library of extension functions when writing java). But I feel it's wrong to downplay Kotlin's role in modernizing things on the jvm. Heck, if it weren't for kotlin as a temporary stopgap, I'd probably would've left the jvm while the features were still lacking in java.

            • pron an hour ago

              > I get your point, but Kotlin is still what made many of these specific features widely known to java developers, and accelerated the push from devs to get similar things into java.

              I disagree for an obvious reason: only a small minority of Java developers know Kotlin. When we want to see if the median developer is ready for some ML feature, we certainly look at other languages, but Kotlin doesn't matter beyond its size (which is not inconsiderable, but is also nowhere near the largest Java competitor that's quick to adopt features).

              > Of course, java has had the advantage of enhancing the jvm while adding the features, where Kotlin had to work around the jvm in some cases (like green threads vs coroutines).

              And C# could have done the same as Java but instead did what Kotlin did (or, rather, Kotlin did what C# had done), and we looked at both and said: we don't want that. That's why I'm saying that the "catching up" narrative doesn't hold up to any scrutiny.

              Obviously, Java has been a huge innovator in optimising compilers, garbage collection, and low-overhead telemetry — areas where it's ahead of virtually everyone else — and focusing innovation on the runtime rather than the language has been one of James Gosling's stated goals since the beginning. So catching up is also silly when talking about a technological leader.

              > But I feel it's wrong to downplay Kotlin's role in modernizing things on the jvm.

              I'm neither downplaying nor overplaying it. As one of the Java architects, I'm telling you what it is. And "modernising things" on the Java Platform ecosystem is quite a different thing from influencing Java language features.

              When we discuss other languages, and we discuss all of them, the ones that are discussed more are either the bigger ones or the more novel ones. Kotlin has shown some novelty, especially around its design of generics and of nullability types, but these happen to be two areas where we have actually not (yet?) made changes.

              > Heck, if it weren't for kotlin as a temporary stopgap, I'd probably would've left the jvm while the features were still lacking in java.

              That may be true, but it's irrelevant to what we're discussing. If anything, if Kotlin had served as a significant enough stopgap for those developers who prefer richer languages, it would have helped us not to adopt certain features or to adopt them more slowly.

              I'm not saying Kotlin hasn't had a positive influence on the platform and, indeed, it may have helped especially in those years when Java stagnated, but it didn't push Java toward adopting more ML features.

              • brabel an hour ago

                > only a small minority of Java developers know Kotlin.

                This is just so wrong. I don't know a single Java developer who does not know Kotlin. In fact, almost everyone is using Kotlin for most code, with Java being mostly used in legacy projects.

                I know you'll answer that I am in a bubble or whatever, but it's frustrating how you think that's a valid argument you can make against me, but not me against you :D seriously. You have no idea what my experience is. I've worked in several countries so I can tell you my experience is not just local. I still like Java (and with Java 28 I am becoming hesitant to continue using only Kotlin for new projects) but anyone who cares about new features like pattern matching was already on Kotlin a long time ago.

                • pron 9 minutes ago

                  I didn't base my statement on personal perception but on industry reports (which report numbers similar to job numbers like these: https://www.devjobsscanner.com/blog/top-8-most-demanded-prog...). It's possible that your perspective industry-wide is more accurate than that of the business analysts, but I have no reason to assume that's the case.

                  > but anyone who cares about new features like pattern matching was already on Kotlin a long time ago.

                  First, that doesn't mean it's not a minority of people. And by the way, we don't base our decision on which language feature to include on the number of people who are already asking for a feature (which is always a minority) but on the number of people we believe will be significantly helped by a feature once they learn about it. I.e. it is perfectly possible that 100% of the people who wanted pattern matching before we added it had left for Kotlin or Scala and at the same time that number amounts to only 10% of the people who enjoy the feature and benefit from it in Java. That many mainstream languages add a feature is only a signal to us that the median developer is ready for it if we decide it's a good feature to add.

                  Second, we don't have usage telemetry in the JDK so we don't get a full picture, and instead we rely on the usual sources for this kind of information: meeting with large customers and analyst reports. If you have access to more comprehensive statistical data, then I would be interested in seeing it, but it's a well-known phenomenon that people are usually only directly exposed to information about their own circles and don't have industry-wide data. The Java ecosystem is huge, and like the situation with the software industry in general and enterprise software in particular, most Java software isn't even written by software companies.

        • throwaway7783 2 hours ago

          >I'm sure there's tech-debt and esoteric compatibility concerns which make evolving Java hard, but from a developer's perspective it's just glacial to evolve and the result is weaksauce.

          This used to be the case a few years ago. But not anymore. Java is evolving very rapidly compared to those years.

    • DarkNova6 5 hours ago

      What I like about Java is that it is a deliberate late-mover language. It doesn't go for the latest shiny thing but looks at what features have proven themselves in other languages.

      I can't help but to be a little sobered by the promises of Kotlin and C#. They look great on the surface, but once you have more complicated code to work on they tend to show warts quite fast.

      Java is remarkably consistent and really doesn't have any sharp edges. Even with generics and type erasure, I found myself fighting the language semantics in C# way more often than Java.

      • jayd16 4 hours ago

        > I found myself fighting the language semantics in C# way more often than Java

        What's an example? I find C# quite well designed despite the Chinese menu of features.

        > Java is remarkably consistent and really doesn't have any sharp edges. Even with generics and type erasure [...]

        These back to back with a straight face...What is a sharp edge in your mind?

        • arein3 4 hours ago

          A sharp edge is writing meta typesystem code infolving covariance, invariance etc

          Saw that in a typescript repository

          It's ok when it's part of a very specific library, it's not ok using it as part of usual project code

          • jayd16 4 hours ago

            What is the significant difference to Java? In C# you would write something like Foo<out Bar> instead of Foo<? extends Bar> or some such thing.

            • ysleepy an hour ago

              In c# you can't be generic over generic types. In java you can. Also enums can't implement interfaces.

          • afdbcreid 2 hours ago

            > A sharp edge is writing meta typesystem code infolving covariance, invariance etc

            Like in Java? C# has its own sharp edges (like most or all languages), but it's almost disingenuous to bring a feature that is much more complex and weird in Java as an example.

      • cogman10 5 hours ago

        I personally enjoy Kotlin. There are potential warts with it, but those exist with other languages.

        That said, Java taking it's time and observing the playing field is a huge benefit. And now that they've been slowly delivering new language features, it's really made it pretty nice flow of powerful well thought out extensions each release. There hasn't been one of the new features that I think missed the mark.

      • biglyburrito 2 hours ago

        Java lacks a ton of quality-of-life features that are table stakes in other languages, including C# and Kotlin. Auto-properties, async, extension methods, nullable reference types, primitive types, string interpolation/templates -- Java is inferior to C# in every one of these areas.

    • biglyburrito 5 hours ago

      Java still inexplicably doesn't have first-class support for string interpolation/templates. They were slated to add it in Java 23, but they removed it from the preview and it hasn't been seen since.

      https://www.happycoders.eu/java/string-templates/

      • pjmlp 5 hours ago

        Because the feedback on how they worked apparently wasn't that positive.

        Also who cares having to use String.format() in the agentic coding age?

        • whartung an hour ago

          At a glance, the string templating system they were trying out looked pretty good to me.

          And clearly a lot of work and time went into it with the previews.

          The fact that they pulled it back suggests they looked down deep into an abyss that looked back at them, and what they saw scared them.

          I don't know if there has been a published deep dive post mortem on the whole string templating thing, but I am quite comfortable with the team yanking it out if they felt it wasn't right.

        • kbenson 5 hours ago

          Honestly, I still write a lot of perl, and while interpolation is nice and good to have for simple things, I find myself using sprintf more and more in production code, especially in the cases the examples always show off, such as needing to alter the variable, add two together, etc. I assume those are just shown to illustrate you you can do that, and not imply you should, because commonly using arbitrary code execution within interpolation is something I'd feel compelled to beat out of my coworkers if I encountered it regularly.

          • ndriscoll 3 hours ago

            The point of (sane) string interpolation is that it runs at compile time, which helps prevent people from inventing crazy template systems at runtime. And you automatically get things like safe SQL queries with parameter binding instead of injection vulnerabilities.

            • kbenson 2 hours ago

              > The point of (sane) string interpolation is that it runs at compile time, which helps prevent people from inventing crazy template systems at runtime.

              It's the trivial cases that are compile time. The interesting templating is done with input that isn't defined within the source, and those can't be run entirely at compile time.

              > And you automatically get things like safe SQL queries with parameter binding instead of injection vulnerabilities.

              That's been solved for decades with parameterized queries (binding variables), and doesn't require interpolation in any way (at least not in the context we're using it here, but probably not at all in most DB drivers and engines). In fact, I would go so far as to say if someone is trying to use string interpolation instead of parameterized queries to avoid SQL injection, they've fundamentally misunderstood the problem and are trying to solve it at the wrong layer.

              Also, if the string interpolation for the query is done at compile time, what type of content known at compile time is something that we'd be worried about SQL injection being in?

              • ndriscoll 2 hours ago

                The "trivial" cases are also the cases people actually need like structured logging, sanitized HTML, and SQL.

                SQL doesn't require interpolation, but it's much cleaner to write it that way and not have to explicitly do binding. It's not an "instead." Like I said, what the interpolator does is automatic safe binding with interpolation syntax.

                The content known at compile time is the query template that you're binding. The point is a compile-time interpolator turns e.g. `sql"""select * from users where name=$name"""` into `Statement("select * from users where name=?").bind(name)`.

                You can also have macro fragments as "inline def" functions in e.g. Scala so that they compose naturally. c.f. Quill[0].

                [0] https://zio.dev/zio-quill/extending-quill

              • kbolino an hour ago

                SQL parameter bindings solve only one part of the problem, that of putting variables into value positions. They don't solve the problem of putting variables into name positions (you cannot "SELECT FROM ?" or anything like it), and they certainly don't solve the problem of dynamic SQL. This is somewhat orthogonal to the topic at hand, but the mentality should be that the problem space is still quite open, with the existing solution being a starting point, not an ending point.

        • mystifyingpoi 3 hours ago

          Interesting point - syntax sugar was nice when writing code by hand. Now we'd be fine if no such sugar was added anymore ever again.

          • ndriscoll 3 hours ago

            Syntax sugar still matters if you need to review the code. It was always about reading, not writing. Actually macros are even more powerful with LLMs. Metaprogramming has always been difficult for many (most?) programmers, but LLMs have no issue with it, and it's mostly doing the kinds of manipulations where as long as it compiles, it's correct, so you don't really need to review it in the same way.

            • pjmlp 3 hours ago

              The LLM itself is the metaprogramming, eventually we will be getting executables directly, the dream of previous AI Summers might finally materialise, with all the implications for the victims of software factories automation.

              • ndriscoll 3 hours ago

                The LLM still benefits from a concise type-checked language to write software in, in the exact way a human does.

                • pjmlp 3 hours ago

                  That would be formal rules, Lean style, and not related to 3 GL languages.

    • sthuck 4 hours ago

      I would definitely trim like 20% off scala, but I think slow compile times were the main reason. To a much lesser degree but sbt being one of the first things you deal with when learning the language didn't help.

      If you put a gun to my head and tell me you can't write in kotlin, you must choose either Java or Scala - for a small project I think I choose modern Java. If you tell me I need to choose for a large cross team and mission critical project - I think I take the bullet.

      Still, I have a soft spot in my heart for scala, learned a lot from it.

    • jmarlow47 5 hours ago

      Kotlin feels like it's having an identity crisis. The gap between the two languages continues to decrease. Kotlin is trying to be server-side, Android, but also every other platform (KMP). Feels like everything is brand new and also deprecated at the same time, always moving on to something new.

      Maybe Roman really was the soul and it lost its touch without him?

      I guess in the age of AI it doesn't matter since a few years from now, if you change your mind, you can just ask Jeeves to one-shot rewrite it back to Java.

      • jeroenhd 4 hours ago

        Until Java fixes its type system to add nullable types (and not in that ridiculous tri-state nullability method that one JEP proposes), Kotlin will be several steps ahead of Java.

        I can speak from experience that Fable 5.1 still writes code that compiles and usually runs fine but throws null pointer exceptions in reasonable edge cases.

        • arein3 4 hours ago

          Waiting so long for type safety and hoping it won't be a weird implementation.

          Kotlin's implementation is very good, hoping with all my heart java will copy it

        • jmarlow47 2 hours ago

          That's valid. Kotlins nullable types do help tremendously in that regard with AI-generated code. If Java nailed a nullable type system that's actually a win for Kotlin as well since Kotlin has to support "platform types" where it can't tell if Java code is producing null or non-null types.

          That's probably the largest gap in usability.

    • 14u2c 4 hours ago

      This comment has major 2018 vibes. Most enterprises I know have have migrated back to mainline Java. We'll see if this changes again LLM era, now that prioritizing the talent pool is less important and the friction of migrating stacks is much reduced.

    • sideeffffect 6 hours ago

      > Java continues to try and catch up to Kotlin

      Does it, really? Java has had pattern matching since 21 (2023). Kotlin still, to this day, the year of our Lord 2026, doesn't...

      • tancop 4 hours ago

        Kotlin had it since 1.0, it's just called `when` instead of `match`.

        https://kotlinlang.org/docs/control-flow.html#expressions

        • wiseowise 2 hours ago

          That’s just fancy switch statement.

        • za3faran 3 hours ago

          Kotlin does not have inline destructuring in pattern matching.

          • ackfoobar 2 hours ago

            Pattern matching with only positional destructuring is a bad feature. I've written enough Scala to say this with confidence.

      • dtech 4 hours ago

        Kotlin has always had smart-casting in if and when (sort of switch) expressions, which are strictly more powerful than the current version of Java "pattern matching". Both don't do de-structuring which I would consider a basic requirement for pattern matching, but at least Kotlin didn't call it pattern matching.

    • pjmlp 5 hours ago

      It is the Java Virtual Machine for a reason.

      Without Google's godfather, Kotlin would be gone for now.

      Kotlin is so great, where is the Kotlin Virtual Machine, showing how Kotlin can stand on its own?

      • jayd16 4 hours ago

        Uhm, Kotlin does compile to native without the JVM doesn't it? It runs in the JVM for Java interop, no?

        https://kotlinlang.org/docs/native-overview.html

        • dathanb82 4 hours ago

          Pretty sure it’s the other way around: Kotlin was implemented on the JVM and that’s its primary target, and got a native implementation later for folks that don’t want to run a JVM.

          • jayd16 4 hours ago

            Is that relevant? Kotlin fully exists without the JVM, as requested.

            • dathanb82 4 hours ago

              Sort of? The kotlin standard library yes, but it’s pretty rare to write an app with only the standard library. It feels like you’re dismissing the Java interop as a secondary benefit, but for most uses of Kotlin it’s probably more important to project success than the language itself. So I think it’s accurate that without the JVM Kotlin would be essentially dead.

              • jayd16 4 hours ago

                > dismissing the Java interop as a secondary benefit

                I mean, I don't really care about any of that. I was just responding to the (likely unserious) technical critique that there is no Kotlin VM. As for whether Kotlin as a language would be popular without the JVM, that's a different question.

                • pjmlp 3 hours ago

                  I stand by it until Kotlin Native is taken seriously, other than porting Android apps into iOS.

            • pjmlp 4 hours ago

              A subset of Kotlin has a native backend, not good enough to power JetBrains products, which still require Java Virtual Machine.

              It is so good, that JetBrains themselves rather use Rust or C++ for native code libraries on their IDEs, and not officially supported on the Android NDK.

              • jayd16 4 hours ago

                So the goal post is JetBrains has to rewrite their stack in Kotlin native for Kotlin to not need the JVM?

                • pjmlp 3 hours ago

                  The goal post is that Kotlin is able to stand on its own, without any dependency of JVM ecosystem, for its evolution as ecosystem.

                  A sign of maturity that Kotlin is grown enough to leave its parents foster home, and stand on its own without pay checks from its folks.

                • oldsecondhand 3 hours ago

                  Eating your own dogfood has always been a milestone of maturity.

        • pjmlp 4 hours ago

          Nope, the JVM is the main platform, and also used for Android development, which by the way, still mostly uses Android Java on the platform code.

          Kotlin Native came later, its memory model was incompatible with Java, thus breaking portability for libraries between JVM and Kotlin Native, thus Jet Brains had to reboot Kotlin Native memory model.

          https://blog.jetbrains.com/kotlin/2021/05/kotlin-native-memo...

          Currently it is mostly used to port Android code into iOS apps, hardly something that even JetBrains could show off running their IDEs on top off, nah, they still need the JVM.

    • Sharlin 4 hours ago

      To be fair, sealed classes were introduced in Java 15 back in 2020. But granted pattern matching is what makes them really useful.

    • pixelstack 5 hours ago

      Scala*

    • troupo 5 hours ago

      Of all languages the only one it's trying to catch up to (and in places outran) is C#

      With many others it doesn't compete because it would need a from-scratch rewrite of the runtime (Erlang/Elixir), or a from-scratch redesign of the type system (Rust, perhaps Swift).