public class IntersectionTypes { public static void mainJava8() { Worker.safeWork( Validator.validate("Hello world!") ); S s = Validator.validate("Intersection types must be aliased"); Worker.safeWork(s); } public static /* look Ma, no generics for type aliasing! */ void mainJava10plus() { Worker.safeWork( Validator.validate("Hello world!") ); var s = Validator.validate("Intersection types can just use `var`"); Worker.safeWork(s); } } interface StringValue {} interface SafeString extends StringValue {} interface UnsafeString extends StringValue {} class Worker { static void safeWork(S s) {} } class Validator { static T validate(String s) { // Check here, maybe throw an exception if invalid, and then if valid ... return CastMagic.cast(s); } } // https://www.gamlor.info/wordpress/2010/11/magic-cast-method-in-java/ class CastMagic { private CastMagic(){} public static TTarget cast(TSource toCast){ return (TTarget) toCast; } }