(我很惊讶无法在 stackoverflow 上找到这个问题,我只能将其归咎于我的谷歌搜索不佳,一定要指出重复...)
这是一个玩具类,它返回您放入其中的相反内容。目前它适用于整数,但只需要非常小的更改即可适用于字符串。
public class Mirror {
int value;
public int get() {
return reverse(value);
}
private int reverse(int value2) {
String valueString = value + "";
String newString = reverse(valueString);
return Integer.parseInt(newString);
}
private String reverse(String valueString) {
String newString = "";
for (char c : valueString.toCharArray()) {
newString = c + newString;
}
return newString;
}
public void set(int value) {
this.value = value;
}
}
我想做的是使类通用,但仅针对两种或三种可能的类型。所以我想写的是:
public class Mirror<X, where X is one of Integer, String, or MagicValue {
X value
public X get(){
[...]
正确的语法是什么?我的 Google-fu 让我失望了...:(
编辑:看起来不是一个正确的语法而且似乎无法完成,所以我的主要问题是:为什么?这似乎是人们在使类真正通用之前可能想要做的事情......
编辑编辑:今天设法与一些实验室伙伴一起找出原因,因此在下面添加了相关的原因答案。
最佳答案
不幸的是java没有直接提供这样的功能。但是我可以建议您解决以下问题:
使用私有(private)构造函数创建参数化类 Mirror
和创建具有特定参数的 Mirror
实例的 3 个静态工厂方法:
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);
}
}
编辑
显然你可以(并且可能应该)将类 Mirror
与其创建分开,例如将工厂方法放在单独的类 MirrorFactory
中。在这种情况下,构造函数应该受到包保护。
如果你想支持大量但数量有限的类,你可以只实现一个通用工厂方法
public static <T> Mirror<T> createMirror(T value) {
checkTypeSupported(value);
return new Mirror(value);
}
方法 checkTypeSupported(value);
可以使用某种元数据(例如属性、JSON 等文件)来获取支持的类型。然而,在这种情况下,您将无法享受编译时验证。
其他解决方案是要求所有支持的类型都扩展某个基类或实现接口(interface):
public class Mirror<T extends MyInterface> {}
但是这个解决方案似乎不符合您的要求,因为您需要 Integer
、String
和 MagicValue
。
关于java - 使 Java 类通用,但仅适用于两种或三种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23722124/