2011-03-15 22 views
8

Genel bir parametre kullanarak ve bir sınıf hiyerarşisinde genel sonucu döndürerek bir yöntem kullanmak istiyorum.Java Generics, sınıf hiyerarşisini kullanırken işaretlenmemiş atama uyarılarını nasıl önlersiniz?

düzenleme: İşte

bir örnek kod gösteren benim sorunum :-) hiçbir SupressWarnings ("kontrolsüz") cevabı izin verildi: bunlardan jenerik istisna nasıl kaldırılır

import java.util.*; 

public class GenericQuestion { 

    interface Function<F, R> {R apply(F data);} 
    static class Fruit {int id; String name; Fruit(int id, String name) { 
     this.id = id; this.name = name;} 
    } 
    static class Apple extends Fruit { 
     Apple(int id, String type) { super(id, type); } 
    } 
    static class Pear extends Fruit { 
     Pear(int id, String type) { super(id, type); } 
    } 

    public static void main(String[] args) { 

     List<Apple> apples = Arrays.asList(
       new Apple(1,"Green"), new Apple(2,"Red") 
     ); 
     List<Pear> pears = Arrays.asList(
       new Pear(1,"Green"), new Pear(2,"Red") 
     ); 

     Function fruitID = new Function<Fruit, Integer>() { 
      public Integer apply(Fruit data) {return data.id;} 
     }; 

     Map<Integer, Apple> appleMap = mapValues(apples, fruitID); 
     Map<Integer, Pear> pearMap = mapValues(pears, fruitID); 
    } 

     public static <K,V> Map<K,V> mapValues(
       List<V> values, Function<V,K> function) { 

     Map<K,V> map = new HashMap<K,V>(); 
     for (V v : values) { 
      map.put(function.apply(v), v); 
     } 
     return map; 
    } 
} 

çağrılar:

Map<Integer, Apple> appleMap = mapValues(apples, fruitID); 
Map<Integer, Pear> pearMap = mapValues(pears, fruitID); 

Bonus soru: derleme hatası nasıl kaldırılır Ben fruitId İşlev bu şekilde ilan etmeleri halinde:

Function<Fruit, Integer> fruitID = new Function<Fruit, Integer>() {public Integer apply(Fruit data) {return data.id;}}; 

o hiyerarşi uğraşıyor zaman jenerik hakkında çok karıştı. Kullanımı hakkında iyi bir kaynak gösterme ve büyük takdir edilecektir.

cevap

10

2 küçük değişiklikler: Referans olarak

public static void main(final String[] args){ 

    // ... snip 

    // change nr 1: use a generic declaration 
    final Function<Fruit, Integer> fruitID = 
     new Function<Fruit, Integer>(){ 

      @Override 
      public Integer apply(final Fruit data){ 
       return data.id; 
      } 
     }; 

    // ... snip 
} 

public static <K, V> Map<K, V> mapValues(final List<V> values, 

    // change nr. 2: use <? super V> instead of <V> 
    final Function<? super V, K> function){ 

    // ... snip 
} 

, bunu okuyun:

The get-put principle

+0

mükemmel, çok teşekkürler. – Guillaume

İlgili konular