An object is polymorphic when its specific type may vary.
The types a specific value may take, is called class.

It is trivial to copy an object if its type is known:

int x;
int y = x;
Here x is not polymorphic, so y is declared of same type (int) as x.
But if the specific type of x were unknown, then y could not be declared of any specific type.

The task: let a polymorphic object contain an instance of some specific type S derived from a type T.
The type T is known.
The type S is possibly unknown until run time.
The objective is to create an exact copy of such polymorphic object (not to create a reference, nor a pointer to).
Let further the type T have a method overridden by S.
This method is to be called on the copy to demonstrate that the specific type of the copy is indeed S.

/* NetRexx */
options replace format comments java crossref savelog symbols binary
 
-- -----------------------------------------------------------------------------
class RCPolymorphicCopy public
 
method copier(x = T) public static returns T
  return x.copy
 
method main(args = String[]) public constant
  obj1 = T()
  obj2 = S()
  System.out.println(copier(obj1).name) -- prints "T"
  System.out.println(copier(obj2).name) -- prints "S"
  return
 
-- -----------------------------------------------------------------------------
class RCPolymorphicCopy.T public implements Cloneable
 
method name returns String
  return T.class.getSimpleName
 
method copy public returns T
  dup = T
 
  do
    dup = T super.clone
  catch ex = CloneNotSupportedException
    ex.printStackTrace
  end
 
  return dup
 
-- -----------------------------------------------------------------------------
class RCPolymorphicCopy.S public extends RCPolymorphicCopy.T
 
method name returns String
  return S.class.getSimpleName
 