2014-02-09 148 views
2

我有一個關於Java泛型類型的問題。具體來說,目前,我有類似這樣的代碼:Java:在子類型中指定泛型類型限制

public interface Foo { 
    public <T> void bar(T[] list) 
} 

public class FooImpl implements Foo{ 
    @Override 
    public <T extends Comparable<? super T>> void bar(T[] list) { 
     ... 
    } 
} 

的問題是,編譯器現在抱怨,我還沒有實現我的FooImpl類的吧,方法。

我想要的是對泛型進行一些額外的限制,特別是它們應該具有可比性。但是我不想把這個限制放在我的Foo接口中,因爲所有的實現都不需要這個限制。 這是可能的,我應該怎麼做才能解決它?

非常感謝!

編輯1:修正了錯別字類 - >類和接口 - >接口。但是,返回類型仍然是無效的,而不是T,我認爲這是無關緊要的。我的實際返回類型是一個布爾值。

編輯2:實際的代碼,如要求:

public interface SortedCriteria { 

    public <E> boolean isSorted(E[] list); 

} 

public class AscendingCriteria implements SortedCriteria { 

    @Override 
    public <E extends Comparable<? super E>> boolean isSorted(E[] list) { 
     int length = list.length; 
     for (int i = 1; i < length; i++) { 
      if (list[i].compareTo(list[i-1]) < 0) return false; 
     } 
     return true; 
    } 

} 
+0

'如果(名單的instanceof可比)'? – christopher

+0

這可能是一個錯字問題。發佈您的實際代碼。 – chrylis

+0

@Chris現在查看課程...請 – venergiac

回答

1

你想要做的是拒絕,因爲這將徹底打破多態性什麼。具有Foo實例的調用者可以擁有您的子類的實例或任何其他子類的實例。由於接口保證可以用任何類型的數組作爲參數調用該方法,所以你的子類不能通過限制它接受的數組種類來破壞這個契約(除非它在運行時通過檢查數組類型並通過拋出異常,當然)。

這歸結於Liskov替代原則,這是多態性和麪向對象的基礎。

但也許你真正想要的是讓富泛型類型:

public interface Foo<T> { 
    public void bar(T[] list); 
} 

public class FooImpl<T extends Comparable<? super T>> implements Foo<T> { 
    @Override 
    public void bar(T[] list) { 
     ... 
    } 
} 
+0

但是,當我測試它時,它在運行時也崩潰了:'Foo impl = new FooImpl(); impl.bar(someArray);'someArray'沒有實現'Comparable' – jCoder

+0

@jCoder你正在使用原始類型。這就是它破裂的原因。 –

+0

@RohitJain肯定,但它只是一個編譯的例子,表明泛型不是微不足道的;) – jCoder