2014-10-26 49 views
4

我试图创建一个映射,将字符串值映射到函数。下面是我创建的接口(如Java中8,但我不能用它):创建一个通用类型的地图

interface Function<T, U> { 
    U apply(T t); 
} 

现在,我创建了一个排序方法基于某些属性我的POJO进行排序:

public <U extends Comparable<U>> void sortPojoBy(Function<Pojo, U> f) { 
     Collections.sort(list, new Comparator<Book>() { 
      @Override 
      public int compare(Pojo first, Pojo second) { 
       return f.apply(first).compareTo(f.apply(second)); 
      } 
     }); 
} 

然后我可以把它传递函数的匿名类由我想要的属性进行排序,例如:

sortBooksBy(new Function<Pojo, Double>(){ 
       @Override 
       public Double apply(Pojo p) { 
        return p.getPrice(); 
       } 
      }); 

现在我有麻烦创建地图。理想情况下,我想是这样的:

Map<String, Function<Pojo, T extends Comparable<T>>> map = new HashMap<>(); 

我知道,我不能做这样的事情,我目前的解决办法是建立一个原函数的地图。

private Map<String, Function> map = new HashMap<>(); 
    { 
     map.put("price", new Function<Pojo, Double>(){ 
      @Override 
      public Double apply(Pojo t) { 
       return t.getPrice(); 
      }   
     }); 
     map.put("name", new Function<Pojo, String>(){ 
      @Override 
      public String apply(Pojo t) { 
       return t.getTitle(); 
      } 

     }); 
    } 

我需要一张地图,因为我从JSON配置文件中获取属性值(名称,价格等)。

所以我的问题是,有没有什么办法来创建我的地图,以确保函数的类型T是可比较的? (我可以处理解决方法,现在,我将手动填充)

回答

4

一种方法是改变它,使所有功能都一​​定要在第一时间返回一个可用的可比性。换句话说,将Map中的参数移到Function的参数中。

interface Function<T, U extends Comparable<? super U>> { 
    U apply(T t); 
} 

您的地图声明现在只是

Map<String, Function<Pojo, ?>> map = new HashMap<>(); 

你的通用方法sortPojoBy现在还执行的U通配符捕获。

public <U extends Comparable<? super U>> void sortPojoBy(Function<Pojo, U> f); 

作为一个附注,我稍微改变了您的Comparable声明。 T extends Comparable<? super T>是典型的形式。这是在T是它提供给Comparable的参数的一个子类。

+0

真的很好!谢谢 :) – user2336315 2014-10-26 20:43:38