วิธีนำเมธอดที่มีพารามิเตอร์เหมือนกันแต่ลายเซ็นต่างกัน

ฉันต้องใช้ฟังก์ชันที่มีฟังก์ชันเหมือนกัน แต่มีประเภทการส่งคืนต่างกันและพารามิเตอร์ของฟังก์ชันก็เหมือนกัน

public static List<Base> remove(List<Subclass> arrange ) {
    List<Base>update = new ArrayList<>();

    for(Subclass arranging : arrange){
        //For-loop body here
    }
    return update;
}

public static List<Subclass> remove(List<Subclass> arrange ) {
    List<Subclass>update = new ArrayList<>();

    for(Subclass arranging : arrange){
        //For-loop body here
    }
    return update;
}  

ที่นี่ Base และ Subclass เป็นคลาสที่กำหนดไว้แล้ว

ควรมีเพียงหนึ่งวิธีเท่านั้นที่ชื่อ remove เนื่องจากฟังก์ชันการทำงานเหมือนกัน ดังนั้นความซ้ำซ้อนจะเกิดขึ้นหากฉันใช้วิธีเดียวกันสองครั้งเพียงเพราะประเภทข้อมูลต่างกัน


person ROHIT PATHAK    schedule 21.05.2019    source แหล่งที่มา
comment
คุณสามารถใช้วิธีเดียวกับยาชื่อสามัญได้ในกรณีที่ความแตกต่างเพียงอย่างเดียวคือประเภทการคืนสินค้า   -  person second    schedule 21.05.2019
comment
อาจซ้ำกันของ วิธีให้เมธอด Java ส่งคืนแบบทั่วไป รายการประเภทใด?   -  person Frakcool    schedule 21.05.2019
comment
ไม่สามารถทำได้หากมีชื่อเหมือนกัน คอมไพเลอร์จะสามารถรู้ได้อย่างไรว่าอันไหนที่จะดำเนินการเมื่อคุณเรียกการลบ (รายการ) อันที่ส่งคืน List‹Base› หรือ List‹Subclass›?   -  person burm87    schedule 21.05.2019
comment
Java ไม่รองรับการโอเวอร์โหลดเมธอดแบบ return-type เปลี่ยนชื่อวิธีการและเรียกวิธีการอื่น หากคุณต้องการหลีกเลี่ยงความซ้ำซ้อน ลิงก์   -  person Sumit Bhardwaj    schedule 21.05.2019
comment
คุณสามารถสร้างการเรียกเมธอดทั่วไป Remove(List‹T› Arrange) และเรียกมันจากทั้งสองคลาสได้   -  person dassum    schedule 21.05.2019
comment
เพียงเก็บ List<Subclass> remove(List<Subclass>) ไว้แล้ววางอีกอัน ไม่มีเหตุผลที่จะเก็บวิธีที่สองไว้   -  person Holger    schedule 21.05.2019


คำตอบ (3)


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

    public static <T> List<T> remove(List<T> arrange) {
        List<T> update = new ArrayList<>();

        for (T arranging : arrange) {
            //For-loop body here
        }
        return update;
    }

จากนั้นคุณสามารถใช้เมธอดนี้กับ T (Base หรือ Subclass) ใดก็ได้ และเมธอดนี้จะทำงานกับองค์ประกอบของรายการผ่านเป็นอาร์กิวเมนต์และส่งกลับประเภทที่เหมาะสมเช่นกัน:

        List<Subclass> one = ...;
        one = remove(one);

        List<Base> two = ...;
        two = remove(two);

หวังว่านี่จะช่วยได้

person Marco R.    schedule 21.05.2019

สิ่งที่คุณต้องการในที่นี้เรียกว่าวิธีการทั่วไป

การประกาศวิธีการทั่วไปเพียงรายการเดียวที่สามารถเรียกได้ด้วยอาร์กิวเมนต์ประเภทต่างๆ ฟังก์ชั่นทั่วไปที่คุณต้องการจะมีลักษณะดังนี้:

public static < E > List<E> remove( List<E> arrange ) {...}

ในกรณีที่มีประเภททั่วไปมากกว่าหนึ่งประเภทและประเภทหนึ่งเป็นคลาสย่อยของอีกประเภทหนึ่ง (เช่น BaseClass และ SubClass) การประกาศจะมีลักษณะดังนี้

public static < E, F > List<E> remove( List<F extends E> arrange ) {...}

สำหรับข้อมูลเพิ่มเติม โปรดดูที่ https://www.tutorialspoint.com/java/java_generics.htm

person chakwok    schedule 21.05.2019

ฉันเห็นว่าคุณอยู่ในสถานการณ์ที่ทั้งสองวิธีทำสิ่งเดียวกันเกือบหมด แต่ให้ผลลัพธ์แตกต่างกับผู้โทร ใช้ข้อมูลทั่วไปหากโดเมนของประเภทการส่งคืนมีขนาดใหญ่กว่า public static E remove(List<E> arrange)

หากประเภทการส่งคืนมีจำกัด คุณอาจพัฒนาความสัมพันธ์ระหว่าง Base และ SubClass และใช้ผลต่างร่วมเพื่อจัดการกับการคืนสินค้าหลายประเภท

person Jayant Kumar    schedule 21.05.2019