java - 使 Java 类通用,但仅适用于两种或三种类型

原文 标签 java generics

(我很惊讶无法在stackoverflow上找到这个问题,我只能归结为糟糕的谷歌搜索,无论如何指出重复......)

这是一个玩具类,它返回与您放入其中的内容相反的内容。目前它适用于整数,但只需要非常小的更改即可适用于 String。

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 不直接提供这样的功能。但是,我可以建议您进行以下工作:

创建参数化类 Mirror使用私有(private)构造函数和 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);
    } 
}

编辑
显然您可以(并且可能应该)将类分开 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 , StringMagicValue .

关于java - 使 Java 类通用,但仅适用于两种或三种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23722124/

相关文章:

java - 使用java-apns(notnoop)发送ios voip通知

java - List <Character>上的StringIndexOutOfBoundsException

c# - 与Haskell参数化类型的C#泛型对比

c# - 在 C# 中对泛型参数使用 "params"关键字

java - 将参数强制转换为泛型变量时的Java方法多态

java - Java中通用数组创建的知识

java - Android读取文件编码问题

java - JVM崩溃了,我不明白为什么

java - 使用目标覆盖时设置 Ant 目标的顺序

c# - 使用构造的返回类型覆盖通用基类属性