Вы можете использовать фабричные методы для всех поддерживаемых типов и сделать конструктор частным / защищенным. В любом случае вы должны исправить универсальный тип в конструкторе, чтобы он имел смысл, чтобы вы могли, вероятно, кодировать его следующим образом:
public final class MyClass<T> {
public static MyClass<Integer> newInstance(int i) {
return new MyClass<Integer>(i);
}
public static MyClass<String> newInstance(String s) {
return new MyClass<String>(s);
}
//More factory methods...
protected MyClass(T obj) {
//...
}
}
Или, если вам не нужен параметр конструктора, что-то вроде этого:
публичный финальный класс MyClass {
public static MyClass newIntegerInstance () {
вернуть новый MyClass ();
}
// ...
}
Как заявил Эриксон, общая реализация в любом случае может полагаться только на Object, поэтому единственным ограничением является то, что вы можете создавать другие реализации для других типов, кроме примитива и String.