2016-11-23 43 views
0

我想重写一个抽象方法如下:Java泛型比得上继承

abstract <C extends Comparable<C>> Map<String, Function<E, C>> getSortingMap(); 

的方法覆盖看起来像这样:

@Override 
Map<String, Function<Contract, Comparable<?>>> getSortingMap() { 
    final Map<String, Function<Contract, Comparable<?>>> map = new HashMap<>(); 
    map.put(Contract.APPRENTICE, e -> e.getApprentice().getLastName()); // String 
    map.put(Contract.COMPANY, e -> e.getCompany().getName()); // Name Object 
    map.put(Contract.EDUCATION_END, e -> e.getEducationEnd()); // Calendar 
    map.put(Contract.STATUS, e -> e.getStatus()); // ENUM 
    return map; 
} 

我有一个警告,我想了不剿警告,因为我想必须有一个干净的解决方案:

Type safety: The return type Map<String,Function<Contract,Comparable<? 
    >>> for getSortingMap() from the type ContractIntegrationTest needs unchecked 
    conversion to conform to Map<String,Function<Contract,Comparable>> from the type 
    _AbstractFinderServiceIntegrationTest<Contract,ContractFilter,ContractSearch> 

有什么办法吗?

回答

0

不久:让你的抽象方法有签名:

abstract Map<String, Function<E, Comparable<?>>> getSortingMap();

龙答:

纵观抽象方法的签名,我无法看到的类型参数E是指定,所以我想这是类的类型参数。

abstract class MyClass<E>

和子类则

class ChildClass extends MyClass<Contract>

话虽如此,签名

<C extends Comparable<C>> List<C> doSomething();

,只是

List<Comparable<?>> doSomething();

返回不同的东西(为了简单起见,我在这里使用列表而不是函数映射,就像你的例子中那样)。

为了打电话给第一个,你需要传递可比的确切类型。因此,例如

List<String> stringList= doSomething();//method with <C>

你得到字符串列表,可以字符串添加到它,从中移除等

但是第二个将返回,可容纳任何种类的可比的列表。

List<Comparable<?>> comparables = doSomething();//method with <?>

,你可以添加任何可比性有你想要的。你不能用String参数化它。如果你从列表中拿一些东西,你会得到Comparable<?>

您不能将stringList指定为可比对象,反之亦然 - 这些内容完全不同。