Implementing equals(), hashCode(), toString() in the hierarchy like the Optional from Guava
Some remarks:


Why does getException() return a Throwable instead of an Exception? Or even better, a RuntimeException? More generally, what is the purpose of this method? If I were you I'd "drop" it and make .get() throw the wanted exception instead. Since the exception would be a RuntimeException, there would be no need to declare it.
Is it on purpose that PresentResult and AbsentResult are not final? What do you expect further subclasses to extend if anything?
Is it legal to initialize a PresentResult with a null value, an AbsentResult with a null exception?