Java generics + วิธีการโรงงานแบบคงที่ = [ตื่นตระหนก]

ฉันคิดว่าตอนนี้ฉันจะเข้าใจ Java generics แล้ว แต่ตอนนี้ฉันทำอะไรไม่ถูกอีกแล้ว

ฉันมีคลาสทั่วไปที่ 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>

โปรดช่วยให้เข้าใจและแก้ไขปัญหานี้
(ฉันต้องการวิธีการแบบโรงงานคงที่สำหรับคลาสดังกล่าวบางคลาสจริงๆ)

แก้ไข
ใครสามารถอธิบายได้ว่าทำไมจึงต้องใช้พารามิเตอร์ประเภทที่ชัดเจน


person java.is.for.desktop    schedule 22.02.2010    source แหล่งที่มา


คำตอบ (2)


พยายาม

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

ดังที่ฉันจำได้จากการนำเสนอของ Josh Bloch เกี่ยวกับ Effective Java 2nd Edition ของเขา: "พระเจ้าฆ่าลูกแมวทุกครั้งที่คุณระบุพารามิเตอร์ประเภทที่ชัดเจน" พยายามหลีกเลี่ยงการก่อสร้างเช่นนี้

person Roman    schedule 22.02.2010
comment
ขอบคุณ การเขียน Constructor ปกตินั้นยาวกว่านั้นอีก ;) และสำหรับกรณีพิเศษของฉัน (ไม่ใช่ ตัวอย่าง) ฉันต้องการวิธีการแบบโรงงานแบบคงที่จริงๆ - person java.is.for.desktop; 22.02.2010
comment
เฮ้อ ไม่มีโอกาสชนะคำตอบที่พูดถึงลูกแมวแล้ว ชาเปา! ;) - person sfussenegger; 22.02.2010
comment
@sfussenegger: ใช่ มันค่อนข้างจะโกง ทุกคนรักลูกแมว ))) - person Roman; 22.02.2010

ในกรณีนี้ คุณต้องตั้งค่าประเภททั่วไปอย่างชัดเจน:

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