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

标签 java generics

(我很惊讶无法在 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> {}

但是这个解决方案似乎不符合您的要求,因为您需要 IntegerStringMagicValue

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

相关文章:

java - GWT 模型 View 演示器,重用演示器?或演示者 - 演示者沟通

java - 线程 “main” java.lang.ArrayIndexOutOfBoundsException : Coordinate out of bounds 中的异常

java - 编译 JAR 文件及其所有 JAR 依赖项

java - 如何通过泛型实例化?

java - 如何在 QuickSelect 中实现重复

java - Lucene - Lucene 文档中字段的名称不是唯一的

scala - 光滑的通用且与驱动程序无关

reactjs - Typescript 编译器不强制执行泛型

ios - 给定枚举作为参数,如何从 func 返回不同的 uibutton 子类?

java - Android Java 是否支持泛型类型的原始类型参数?