Generik Java + metode pabrik statis = [panik]

Saya pikir, saya akan memahami obat generik Java sekarang. Namun kini aku tak berdaya lagi.

Saya memiliki kelas generik di mana c-tor membuat instance yang diketik dengan benar, sementara metode pabrik statis menghasilkan ketidakcocokan tipe.

Silakan lihat kode berikut:

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);
  }

}

Kesalahannya adalah:

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>

Mohon bantuannya untuk memahami dan menyelesaikan masalah ini.
(Saya benar-benar membutuhkan metode pabrik statis untuk beberapa kelas seperti itu).

EDIT
Dapatkah seseorang juga menjelaskan mengapa parameter tipe eksplisit harus digunakan?


person java.is.for.desktop    schedule 22.02.2010    source sumber


Jawaban (2)


Mencoba

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

Seperti yang saya ingat dari presentasi Josh Bloch tentang Java Efektif Edisi ke-2: "Tuhan membunuh anak kucing setiap kali Anda menentukan parameter tipe eksplisit". Cobalah untuk menghindari konstruksi seperti ini.

person Roman    schedule 22.02.2010
comment
Terima kasih. Nah, untuk menulis konstruktor biasa lebih lama lagi ;) Dan untuk kasus khusus saya (bukan contoh) saya sangat membutuhkan metode pabrik statis. - person java.is.for.desktop; 22.02.2010
comment
Huh, tidak ada peluang untuk mengalahkan jawaban yang menyebutkan anak kucing. Chapeau! ;) - person sfussenegger; 22.02.2010
comment
@sfussenegger: ya, itu agak curang, semua orang suka anak kucing ))) - person Roman; 22.02.2010

Dalam hal ini, Anda harus menyetel tipe generik secara eksplisit:

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