当前位置: 首页 > 面试题库 >

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

商兴朝
2023-03-14
问题内容

我想知道在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,并在可能的情况下使用多态。


问题答案:

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

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


 类似资料:
  • 我试图在类型s. t上专门化一个类。它忽略了给定类型的恒定性。在这种情况下,该类型是一个模板模板参数: 上面的代码在GCC 4.8.4和clang 5.0(with-std=c 11)中都抱怨bar在与匹配FOFType模板参数化的类一起使用时未定义。即使我删除了sfinae参数,仍然无法找到特化。 这个问题的一个例子可以在这里找到:https://godbolt.org/g/Cjci9C.在上面

  • 我有这样的代码: 这段代码的目的是:如果是或的子类,则将推导为,否则推导为

  • 问题内容: 这是我的代码: 它运作良好。但是当我尝试添加这个 我遇到编译器错误:«int MyClass :: DoSomething()»的«>»令牌模板标识«DoSomething <0>»之前的无效显式专门化与任何模板声明都不匹配 我使用g ++ 4.6.1应该怎么做? 问题答案: 不幸的是,如果不对外部模板进行特殊化处理,就不能对作为类模板成员的模板进行特殊处理: C ++ 11 14.7

  • 我有一个通用算法,需要访问其模板类型的特征。有一个特征类可以专门用于提供这些特征。 在我的类中使用此算法时,我想将其与类中定义的私有类型一起使用。 然而,专门化只能发生在或全局范围内,而我的类是不可访问的。 是否有可能以某种方式专门化具有私有类型的模板,至少在可访问此类型的范围内? 也许可以将这个专门化声明为一个类?

  • 还尝试在专门化的中进行模板方法专门化: 这一次它编译,但调用原始方法,即 解决方案

  • 我如何像这样?也许Boost支持它,如果不是C++或C++11中的新特性?