Gọi các phương thức chung tĩnh


106

Tôi đã gặp một tình huống tò mò liên quan đến các phương pháp chung tĩnh. Đây là mã:

class Foo<E>
{
    public static <E> Foo<E> createFoo()
    {
        // ...
    }
}

class Bar<E>
{
    private Foo<E> member;

    public Bar()
    {
        member = Foo.createFoo();
    }
}

Tại sao tôi không phải chỉ định bất kỳ đối số kiểu nào trong biểu thức Foo.createFoo()? Đây có phải là một loại suy luận kiểu? Nếu tôi muốn rõ ràng về nó, tôi có thể chỉ định đối số kiểu như thế nào?


7
Tôi khuyên bạn nên thay đổi tham số kiểu E của phương thức createFoo. Bởi vì, tham số kiểu E của lớp Foo khác với tham số kiểu E của phương thức createFoo ().
Gursel Koca

@GurselKoca Anh ấy rõ ràng có thể làm member = Foo. <E> createFoo (); yêu cầu chúng giống như thời gian biên dịch.
George Xavier

Câu trả lời:


183

Có, đây là kiểu suy luận dựa trên mục tiêu của nhiệm vụ, theo JLS phần 15.12.2.8 . Nói một cách rõ ràng, bạn sẽ gọi một cái gì đó như:

Foo.<String>createFoo();

3
Hoặc, như trong trường hợp của tôi: Foo.<E>createFoo();Cảm ơn bạn :)
fredoverflow

7
Làm thế nào mà điều này cũng hoạt động mà không có nhiệm vụ? Đó là, câu lệnh Foo.createFoo(); biên dịch tốt ...? Đây có phải là do tẩy xóa loại?
fredoverflow

9
@FredOverflow mà không có chỉ định Eđược "suy ra" làObject
chối cãi vào

2
Vị trí liên kết mới có thể sẽ là: docs.oracle.com/javase/specs/jls/se8/html/…
Joanis

3
Một cách khác nhau để xác định các loại Esẽ được xác định createFoo()có một đối số kiểu Class<E>(vì vậy nó sẽ là createFoo(Class<E> type)), và gọi nó vớicreateFoo(String.class)
Gavin S. Yancey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.