/**
 * Holder class of the classes that trigger the java generics issue in DoxyGen.
 * @author edwinf
 */
public class DoxygenIssue {

    /**
     * Pretty much nothing.
     *
     * @param args command line arguments.
     */
    public static void main(String ... args) {
        System.out.println("Hi there!.");
    }


    /**
     * Initial class of the generics tree.
     *
     * @param <T> Class parameter.
     */
    public static abstract class MyBaseClass<T> {
        /**
         * Data holder.
         */
        protected final T myValue;

        /**
         * Base Constructor
         *
         * @param myValue Initial reference value to hold.
         */
        public MyBaseClass(T myValue) {
            this.myValue = myValue;
        }
    }

    /**
     * Second-level class in the tree. All the classes that inherits this one, will be
     * holding instances of {@link Number}.
     *
     * @param <T> Class parameter that needs to extend from {@link Number}.
     */
    public static abstract class MyNumericClass<T extends Number> extends MyBaseClass {
        
        /**
         * Numeric holder class constructor.
         *
         * @param myValue Number reference to hold.
         * @see DoxygenIssue.MyBaseClass#MyBaseClass(java.lang.Object)
         */
        public MyNumericClass(T myValue) {
            super(myValue);
        }

    }

    /**
     * Third-level class in the inheritance tree. This class gives type-safety for
     * holding {@link Integer}.
     */
    public static class MyIntegerClass extends MyNumericClass<Integer> {

        /**
         * Integer holder class constructor.
         *
         * @param myValue Integer reference to hold.
         * @see DoxygenIssue.MyNumericClass#MyNumericClass(java.lang.Number)
         */
        public MyIntegerClass(Integer myValue) {
            super(myValue);
        }
    }

    /**
     * Sibling of class {@link DoxygenIssue.MyNumericClass}.
     */
    public static class MyDoubleClass extends MyBaseClass<Double> {

        /**
         * Double holder class constructor.
         *
         * @param myValue Reference of type {@link Double} to hold.
         * @see DoxygenIssue.MyBaseClass#MyBaseClass(java.lang.Object)
         */
        public MyDoubleClass(Double myValue) {
            super(myValue);
        }
    }

    /**
     * Private constructor.
     */
    private DoxygenIssue() {
    }
}
