/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
interface Interface {
}
class Foo implements Interface {
Foo(int magicInt) { magicInt = magicInt + 1; /* do some fancy calculations */ }
}
class Bar implements Interface {
Bar(int magicInt) { magicInt = magicInt + 2; /* do some fancy calculations */ }
}
class Factory<T extends Interface> {
int magicInt = 0;
T createNewObject(Class<T> typeToMake) {
final java.lang.reflect.Constructor<T> magicIntConstructor;
try {
magicIntConstructor
= typeToMake.
getDeclaredConstructor(Integer.
TYPE); }
final T t;
try {
t = magicIntConstructor.newInstance(magicInt);
}
return t;
}
}
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
Factory<Foo> fooFactory = new Factory<Foo>();
Foo foo = fooFactory.createNewObject(Foo.class);
Factory<Bar> barFactory = new Factory<Bar>();
Bar bar = barFactory.createNewObject(Bar.class);
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgppbnRlcmZhY2UgSW50ZXJmYWNlIHsKfQoKY2xhc3MgRm9vIGltcGxlbWVudHMgSW50ZXJmYWNlIHsKCUZvbyhpbnQgbWFnaWNJbnQpIHsgbWFnaWNJbnQgPSBtYWdpY0ludCArIDE7IC8qIGRvIHNvbWUgZmFuY3kgY2FsY3VsYXRpb25zICovIH0KfQoKY2xhc3MgQmFyIGltcGxlbWVudHMgSW50ZXJmYWNlIHsKCUJhcihpbnQgbWFnaWNJbnQpIHsgbWFnaWNJbnQgPSBtYWdpY0ludCArIDI7IC8qIGRvIHNvbWUgZmFuY3kgY2FsY3VsYXRpb25zICovIH0KfQoKY2xhc3MgRmFjdG9yeTxUIGV4dGVuZHMgSW50ZXJmYWNlPiB7CiAgICBpbnQgbWFnaWNJbnQgPSAwOyAKCiAgICBUIGNyZWF0ZU5ld09iamVjdChDbGFzczxUPiB0eXBlVG9NYWtlKSB7CiAgICAJZmluYWwgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I8VD4gbWFnaWNJbnRDb25zdHJ1Y3RvcjsKICAgIAl0cnkgewogICAgCQltYWdpY0ludENvbnN0cnVjdG9yID0gdHlwZVRvTWFrZS5nZXREZWNsYXJlZENvbnN0cnVjdG9yKEludGVnZXIuVFlQRSk7CiAgICAJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKICAgIAkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vIHZhbGlkIGNvbnN0cnVjdG9yISIpOwogICAgCX0KICAgIAlmaW5hbCBUIHQ7CiAgICAJdHJ5IHsKICAgIAkJdCA9IG1hZ2ljSW50Q29uc3RydWN0b3IubmV3SW5zdGFuY2UobWFnaWNJbnQpOwogICAgCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb258SWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbnxqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKICAgIAkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkbid0IGluc3RhbnRpYXRlLiIpOwogICAgCX0KICAgIAlyZXR1cm4gdDsKICAgIH0KfQoKLyogTmFtZSBvZiB0aGUgY2xhc3MgaGFzIHRvIGJlICJNYWluIiBvbmx5IGlmIHRoZSBjbGFzcyBpcyBwdWJsaWMuICovCmNsYXNzIElkZW9uZQp7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCXsKCQlGYWN0b3J5PEZvbz4gZm9vRmFjdG9yeSA9IG5ldyBGYWN0b3J5PEZvbz4oKTsKCQlGb28gZm9vID0gZm9vRmFjdG9yeS5jcmVhdGVOZXdPYmplY3QoRm9vLmNsYXNzKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oZm9vKTsKCQkKCQlGYWN0b3J5PEJhcj4gYmFyRmFjdG9yeSA9IG5ldyBGYWN0b3J5PEJhcj4oKTsKCQlCYXIgYmFyID0gYmFyRmFjdG9yeS5jcmVhdGVOZXdPYmplY3QoQmFyLmNsYXNzKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oYmFyKTsKCX0KfQo=