2016-01-14 42 views
5

Bunu dönüştürmek çalışıyorum:Java 8 jenerikler ve tür kesmesi sorunu

daha modern Java 8 akışları sürümüne, sadece iyi derler
static Set<String> methodSet(Class<?> type) { 
    Set<String> result = new TreeSet<>(); 
    for(Method m : type.getMethods()) 
     result.add(m.getName()); 
    return result; 
} 

:

static Set<String> methodSet2(Class<?> type) { 
    return Arrays.stream(type.getMethods()) 
     .collect(Collectors.toCollection(TreeSet::new)); 
} 

bir hata üretir Hangi ileti:

error: incompatible types: inference variable T has incompatible bounds 
     .collect(Collectors.toCollection(TreeSet::new)); 
      ^
    equality constraints: String,E 
    lower bounds: Method 
    where T,C,E are type-variables: 
    T extends Object declared in method <T,C>toCollection(Supplier<C>) 
    C extends Collection<T> declared in method <T,C>toCollection(Supplier<C>) 
    E extends Object declared in class TreeSet 
1 error 

Derleyicinin neden bu sorunu çözmek için sorun yaşadığını anlayabiliyorum. nference. Göremediğim şey, onu nasıl düzelteceğimiz. Kimse biliyor mu?

cevap

11

Hata iletisi özellikle açık değildir, ancak sorun, yöntemlerin adını değil, yöntemlerin kendileri toplamanızdır. o eksik

static Set<String> methodSet2(Class<?> type) { 
    return Arrays.stream(type.getMethods()) 
       .map(Method::getName) // <-- maps a method to its name 
       .collect(Collectors.toCollection(TreeSet::new)); 
} 
+0

Maalesef ve onu işaret için teşekkür ederim: Başka terimlerle

, onun adına Method gelen eşleme eksik. – user1677663