2014-02-09 64 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