Java 泛型 + 静态工厂方法 = [ panic ]

标签 java generics static-methods type-systems

我想,我现在应该理解 Java 泛型了。但现在我又无助了。

我有一个通用类,其中 c-tor 构造正确类型的实例,而静态工厂方法产生类型不匹配。

请看下面的代码:

public class _GenericFactoryMethods {

  public final static class DemoClass<T1, T2> {
    private final T1 _1;
    private final T2 _2;

    // static factory method
    public static <T1, T2> DemoClass<T1, T2> create(T1 _1, T2 _2) {
      return new DemoClass<T1, T2>(_1, _2);
    }

    // usual c-tor
    public DemoClass(T1 _1, T2 _2) {
      this._1 = _1;
      this._2 = _2;
    }

    public T1 get1() { return _1; }

    public T2 get2() { return _2; }
  }

  public void doSomething() {
    String str = "test";

    Class<? extends CharSequence> _1 = str.getClass();
    CharSequence _2 = str;

    // works
    DemoClass<Class<? extends CharSequence>, CharSequence> dc1 =
        new DemoClass<Class<? extends CharSequence>, CharSequence>(_1, _2);

    // compile error
    DemoClass<Class<? extends CharSequence>, CharSequence> dc2 =
        DemoClass.create(_1, _2);
  }

}

错误是:

Uncompilable source code - incompatible types
required: _GenericFactoryMethods.DemoClass<java.lang.Class<? extends java.lang.CharSequence>,java.lang.CharSequence>
found:    _GenericFactoryMethods.DemoClass<java.lang.Class<capture#794 of ? extends java.lang.CharSequence>,java.lang.CharSequence>

请帮助理解并解决这个问题。
(我真的需要一些这样的类的静态工厂方法)。

编辑
有人还可以解释为什么必须使用显式类型参数吗?

最佳答案

尝试

DemoClass.<Type1, Type2>create(_1, _2);

我记得 Josh Bloch 在介绍他的 Effective Java 第 2 版时说:“每次你指定一个显式类型参数时,上帝都会杀死一只小猫”。尽量避免这样的结构。

关于Java 泛型 + 静态工厂方法 = [ panic ],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2310831/

相关文章:

ios - Swift:将泛型类型转换为相同的泛型类型但具有关联类型的子类

java - NoSuchMethodError用反射调用枚举子类类型的valueOf()吗?

java - 为什么我不能使用已实现接口(interface)的静态方法?

Java:静态与动态绑定(bind)(再次)

java - Vim25 发生一般系统错误 : Authorize Exception

java - 如何以编程方式接收 whatsapp 消息?

java - JUnit 5 : Inject spring components to Extension (BeforeAllCallback/AfterAllCallback)

java - 有没有办法将泛型参数限制为数组?

java - 错误消息指出Java的构造函数放置不正确

java - 不兼容类型:无法将节点转换为Comparable(作为参数传递时)