不幸的是java并没有直接提供这样的功能。不过,我可以建议您采取以下解决方法:
创建参数化类Mirror
具有私有构造函数和 3 个创建实例的静态工厂方法Mirror
具有特定参数:
public class Mirror<T> {
private T value
private Mirror(T value) {
this.value = value;
}
public static Mirror<Integer> integerMirror(Integer value) {
return new Mirror(value);
}
public static Mirror<String> stringMirror(String value) {
return new Mirror(value);
}
public static Mirror<MagicValue> magicMirror(MagicValue value) {
return new Mirror(value);
}
}
EDIT显然你可以(并且可能应该)将班级分开Mirror
从它的创建开始,例如将工厂方法放在单独的类中MirrorFactory
。在这种情况下,构造函数应该受到包保护。
如果您想支持大量但数量有限的类,您可以只实现一种通用工厂方法
public static <T> Mirror<T> createMirror(T value) {
checkTypeSupported(value);
return new Mirror(value);
}
Method checkTypeSupported(value);
可以使用某种元数据(例如属性、JSON 等文件)来获取支持的类型。然而在这种情况下,您将无法享受编译时验证。
其他解决方案是要求所有受支持的类型扩展某些基类或实现接口:
public class Mirror<T extends MyInterface> {}
但这个解决方案似乎不符合您的要求,因为您需要Integer
, String
and MagicValue
.