可能的 Java 泛型(模板)特化(用特定类型覆盖模板类型)

标签 java generics

我想知道在 Java 中专门化泛型类型的选项是什么,即在模板类中对某些类型有特定的覆盖。

在我的例子中,我是一个泛型类(T 类型),通常返回 null,但是当 T 是 String 类型时返回“”(空字符串),或者当它是 Integer 类型时返回 0(零)等.

仅提供特定于类型的方法重载会产生“方法不明确”错误:

例如:

public class Hacking {

  public static void main(String[] args) {
    Bar<Integer> barInt = new Bar<Integer>();
    Bar<String> barString = new Bar<String>();

    // OK, returns null
    System.out.println(barInt.get(new Integer(4)));

    // ERROR: The method get(String) is ambiguous for the type Bar<String>
    System.out.println(barString.get(new String("foo")));
  }

  public static class Bar<T> {

    public T get(T x) {
      return null;
    }

    public String get(String x) {
      return "";
    }  
  }
}

是用特定类型子类化泛型类的唯一选择吗(参见下面示例中的 StringBar?

  public static void main(String[] args) {
    Bar<Integer> barInt = new Bar<Integer>();
    StringBar barString2 = new StringBar();

    // OK, returns null
    System.out.println(barInt.get());

    // OK, returns ""
    System.out.println(barString2.get());
  }

  public static class Bar<T> {

    public T get() {
      return null;
    }
  }

  public static class StringBar extends Bar<String> {
    public String get() {
      return "";
    }
  }
}

这是唯一的方法吗,必须为我想要专门化的每种类型创建一个子类而不是在 Bar 类中重载 get() 有点痛苦。

我猜我可以检查 Bar.get() 方法中的 instanceof,例如 得到(T t) { if (t instanceof String) return ""; if (t instanceof Integer) 返回 0; 否则返回空值; }

但是,我被教导要尽可能避免使用 instanceof 并使用多态性。

最佳答案

综合考虑,一致认为问题中提到的 StringBar 方法是唯一可行的方法。

  public static class StringBar extends Bar<String> {
    public String get() {
      return "";
    }
  }

关于可能的 Java 泛型(模板)特化(用特定类型覆盖模板类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3988180/

相关文章:

java - 为什么 setMaximumFractionDigits 不包含某些数字

java - 泛型下界 ('super' ) 问题?

typescript - 如何删除重复的类型并避免以 never 结尾?

generics - 通用 F# 函数 : How to get the Type of an F# Discriminated Union?

java - android系统是否包含JVM?

java - Spark Java中计算中位数

java - Java 8 中 "If/Throw, Else/Return"逻辑的简写?

java - 无法将 List<SomeClass<SomeClass 的边界类型的子级>> 添加到 List<SomeClass<?>>

.net - 有状态的 IComparer<T> 是否存在合理的场景?

java - 调用Bean属性中的方法