
/* Name of the class has to be "Main" only if the class is public. */
public class Main
{
	public static class MyClass {
		public MyClass() {
			System.out.println("MyClass default constructor");
		}
	}
	
	public static class MySubClass extends MyClass {
		public MySubClass() {
			super();
			System.out.println("MySubClass default constructor");
		}
	}
	
	public static class Factory<T extends MyClass> {
		public T create() {
			final T t = new T();
			return t;
		}
		
		public T create(final Class<? extends T> clazz) throws Exception {
			final T t = clazz.newInstance();
			return t;
		}
	}
	
	public static void main(String[] args) throws Exception {
		final Factory<MySubClass> factory = new Factory<MySubClass>();
		
		final MySubClass msc = factory.create();
		// final MySubClass msc = factory.create(MySubClass.class);
		
		System.out.println("Created instance: " + msc);
	}
}