簡體   English   中英

覆蓋通用方法

[英]Override generic method

根據JLS (Java語言規范):

子簽名的概念旨在表示兩種方法之間的關系,這些方法的簽名不完全相同,但是其中一個可以覆蓋另一個方法。 具體來說,它允許簽名不使用泛型類型的方法覆蓋該方法的任何泛化版本。

該代碼基於JLS示例:

interface CollectionConverter<U> {
    <T> List<T> toList(Collection<T> c);

    void fooMethod(Class<?> c);

    <E>Comparable<E> method3(E e);

    Comparable<U> method4(U u);
}

class Overrider implements CollectionConverter<Integer> {
    @Override
    public List toList(Collection c) {
        return null;
    }

    @Override
    public void fooMethod(Class c) {

    }

    @Override
    public  Comparable method3(Object o) {
        return null;
    }

    @Override
    // compile error, have to change Object to Integer 
    public Comparable method4(Object u) {                       

        return null;
    }
}

根據JLS,我了解為什么前三種方法可以很好地工作,但是我無法弄清楚method4為何存在此編譯錯誤:

類型為Overrider的method4(Object)方法必須重寫或實現一個超類型方法。

CollectionConvertermethod4的簽名為

Comparable<U> method4(U u);

您聲明Overrider來實現CollectionConverter<Integer> ,從而將類型參數U綁定到Integer 簽名將變為:

Comparable<Integer> method4(Integer u);

您可以在Overrider聲明method4(Object u) ,但與根本不使用泛型的情況相比,該方法簽名不會覆蓋接口中指定的method4(Integer u)

問題在於此時類型變量U已綁定到Integer 如果將聲明更改為

public Comparable method4(Integer u) ...

這是一個替代

因為在接口中,method4的聲明類型與接口(U)相同。 如果將其更改為其他內容,則應該可以使用。

例如

<A> Comparable<A> method4(A a);

對於想要用通用參數覆蓋沒有通用返回類型的方法的特定情況,您需要確保該參數的類型實際上是該通用類型的子級。

例如:

protected Response updateResource(long id, T payload, RequestContext context){}

被覆蓋

@Override
protected Response updateResource(long id, Payload payload, RequestContext context){}

贊成IntelliJ IDEA的代碼>生成...>覆蓋方法...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM