Proof
 The Profunctor
type this optic evaluates.S
 The input object type.T
 The output object type.A
 The input field type.B
 The output field type.public interface Optic<Proof extends K1,S,T,A,B>
An optic can be thought to take some transformation S > T
between object types and another
(unrelated) transformation A > B
between field types, and produces a new transformation between
object types such that the field A
in S
is transformed into B
using the field
function, while the rest of S
is transformed using the original function.
The object type is also known as a source, and the field type is also known as a focus. The terms "object" and "field" are used throughout in this documentation in order to draw a parallel to the objectoriented paradigm. Note, however, that an optic need not act on a literal field of a conventional object. Also note that optics need not act on a single field, depending on the profunctor this optic takes its behavior from.
Profunctor
,
An Introduction to Optics: Lenses and PrismsModifier and Type  Interface and Description 

static class 
Optic.CompositionOptic<Proof extends K1,S,T,A,B,A1,B1>
An optic that represents the composition of two compatible optics.

Modifier and Type  Method and Description 

default <Proof2 extends Proof,A1,B1> 
compose(Optic<? super Proof2,A::A1,B::B1> optic)
Composes this optic with another optic that operates on the field types of this optic.

default <Proof2 extends K1,A1,B1> 
composeUnchecked(Optic<?,A::A1,B::B1> optic)
Composes this optic with another optic that operates on the field types of this optic without checking for
type compatibility.

<P extends K2> 
eval(? extends Proof<P> proof)
Applies the given
Profunctor to this optic to produce a
function that converts a transformation between the field types into a transformation between the object types. 
default <Proof2 extends K1> 
upCast(Set<TypeToken<? extends K1>> proofBounds,
TypeToken<Proof2> proof)
Refines the profunctor type accepted by this optic to the given type, checking against the given bounds.

<P extends K2> (P<A,B>) > P<S,T> eval(? extends Proof<P> proof)
Profunctor
to this optic to produce a
function that converts a transformation between the field types into a transformation between the object types.P
 The type associated with the profunctor.proof
 The profunctor associated with this optic.default <Proof2 extends Proof,A1,B1> Optic<Proof2,S::A1,T::B1> compose(Optic<? super Proof2,A::A1,B::B1> optic)
Optic.CompositionOptic
.Proof2
 The profunctor type class of the given optic.A1
 The subfield input type.B1
 The subfield output type.optic
 The subfield optic.Optic.CompositionOptic
default <Proof2 extends K1,A1,B1> Optic<?,S::A1,T::B1> composeUnchecked(Optic<?,A::A1,B::B1> optic)
Warning: This method is unsound. Care must be taken that the profunctor types for this optic and the given optic actually have a common descendant.
Optic.CompositionOptic
.Proof2
 The profunctor common descendant for this and the given optic.A1
 The subfield input type.B1
 The subfield output type.optic
 The subfield optic.compose(Optic)
,
Optic.CompositionOptic
default <Proof2 extends K1> Optional<Optic<? super Proof2,S::A,T::B>> upCast(Set<TypeToken<? extends K1>> proofBounds, TypeToken<Proof2> proof)
Proof2
 The refined profunctor type.proofBounds
 The lower bounds of Proof2
.proof
 The type tag for the refined profunctor type.