DelegateCoder extends CustomCoder<T> { @Override public TypeDescriptor<T> getEncodedTypeDescriptor() { if (typeDescriptor == null) { return super.getEncodedTypeDescriptor(); } return typeDescriptor; } protected  DelegateCoder(
      Coder<IntermediateT> coder,
      CodingFunction<T, IntermediateT> toFn,
      CodingFunction<IntermediateT, T> fromFn,
      @Nullable TypeDescriptor<T> typeDescriptor); static DelegateCoder<T, IntermediateT> of(
      Coder<IntermediateT> coder,
      CodingFunction<T, IntermediateT> toFn,
      CodingFunction<IntermediateT, T> fromFn); static DelegateCoder<T, IntermediateT> of(
      Coder<IntermediateT> coder,
      CodingFunction<T, IntermediateT> toFn,
      CodingFunction<IntermediateT, T> fromFn,
      @Nullable TypeDescriptor<T> typeDescriptor); @Override void encode(T value, OutputStream outStream); @Override void encode(T value, OutputStream outStream, Context context); @Override T decode(InputStream inStream); @Override T decode(InputStream inStream, Context context); Coder<IntermediateT> getCoder(); @Override void verifyDeterministic(); @Override Object structuralValue(T value); @Override boolean equals(@Nullable Object o); @Override int hashCode(); @Override String toString(); @Override TypeDescriptor<T> getEncodedTypeDescriptor();  }
@Test public void testEncodedTypeDescriptor() throws Exception { TypeDescriptor<Set<Integer>> typeDescriptor = new TypeDescriptor<Set<Integer>>() {}; assertThat(TEST_CODER.getEncodedTypeDescriptor(), equalTo(typeDescriptor)); }