可以进行Java泛型(模板)专业化(使用特定类型覆盖模板类型)

问题描述

考虑到所有问题,共识似乎是问题中提到的StringBar方法是唯一的方法

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

解决方法

我想知道在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 get(T t){if(t instanceof String)返回“”;如果(t
instanceof Integer)返回0; 否则返回null;}

但是,我被教导要避免instanceof,并在可能的情况下使用多态。

猜你在找的技术问答相关文章

如何检查配对的蓝牙设备是打印机还是扫描仪(Android)
是否允许实体正文进行HTTP DELETE请求?
如何将ZipInputStream转换为InputStream?
java.util.logging Java 8中的变量
PowerMockito.doReturn返回null
Java中的RESTful调用
Swing / Java:如何正确使用getText和setText字符串
特殊字符和重音字符
Android Studio中的ndk.dir错误
错误“找不到主类”