簡體   English   中英

Java泛型+靜態工廠方法= [恐慌]

[英]Java generics + static factory methods = [panic]

我想,我現在會理解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 2nd Edition的演講:“每當你指定一個明確的類型參數時,上帝會殺死一只小貓”。 盡量避免像這樣的結構。

在這種情況下,您必須顯式設置泛型類型:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM