5

Tôi có một giao diện PersonFactory như sau:hợp nhà xây dựng tự động trong phương pháp mặc định

@FunctionalInterface 
public interface PersonFactory<P extends Person> { 
    P create(String firstname, String lastname); 

    // Return a person with no args 
    default P create() { 
     // Is there a way I could make this work? 
    } 
} 

Các Person lớp:

public class Person { 
    public String firstname; 
    public String lastname; 

    public Person() {} 

    public Person(String firstname, String lastname) { 
     this.firstname = firstname; 
     this.lastname = lastname; 
    } 
} 

Tôi muốn để có thể nhanh chóng Person s của tôi như thế này:

PersonFactory<Person> personFactory = Person::new; 

Person p = personFactory.create(); // does not work 
Person p = personFactory.create("firstname", "lastname"); // works 

Có cách nào tôi có thể làm cho đồng Java không mpiler tự động chọn hàm tạo đúng bằng cách khớp với chữ ký của PersonFactory.create()?

+2

số Cách duy nhất hợp lý bạn có thể thực hiện phương pháp mặc định là bằng cách làm 'this.create ("someDefaultFirstName", "someDefaultLastName") ; ' –

Trả lời

5

Một cách sẽ có những điều sau đây:

default P create() { 
    return create(null, null); 
} 

Nhưng tôi không chắc chắn đó là những gì bạn muốn. Vấn đề là bạn không thể thực hiện một tham chiếu phương thức tham chiếu đến 2 phương thức khác nhau (hoặc các hàm tạo). Trong trường hợp này, bạn muốn Person::new để tham chiếu đến hàm tạo không có tham số hàm tạo sử dụng 2 tham số, điều này là không thể.

Khi bạn có:

@FunctionalInterface 
public interface PersonFactory<P extends Person> { 
    P create(String firstname, String lastname); 
} 

và sử dụng nó như

PersonFactory<Person> personFactory = Person::new; 
Person p = personFactory.create("firstname", "lastname"); 

bạn phải nhận ra rằng phương pháp tham chiếu Person::new đề cập đến constructor lấy 2 tham số. Dòng tiếp theo chỉ gọi nó bằng cách truyền các tham số.

Bạn cũng có thể viết nó explicitely hơn sử dụng một biểu thức lambda:

PersonFactory<Person> personFactory = (s1, s2) -> new Person(s1, s2); // see, we have the 2 Strings here 
Person p = personFactory.create("firstname", "lastname"); 
Các vấn đề liên quan