【问题标题】:Java Generics, how to avoid unchecked assignment warning when using class hierarchy?Java泛型,使用类层次结构时如何避免未经检查的赋值警告?
【发布时间】:2011-03-15 09:44:19
【问题描述】:

我想使用一个使用泛型参数并在类层次结构上返回泛型结果的方法。

编辑: SupressWarnings("unchecked") 允许回答 :-)

这是说明我的问题的示例代码:

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;
    }
}

如何从这些调用中删除通用异常:

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

额外问题:如果我以这种方式声明 fruitId 函数,如何消除编译错误:

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

在处理层次结构时,我对泛型感到非常困惑。任何指向关于使用和的良好资源的指针将不胜感激。

【问题讨论】:

    标签: java generics compiler-warnings


    【解决方案1】:

    2 个小改动:

    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
    }
    

    作为参考,请阅读:

    The get-put principle

    【讨论】:

      猜你喜欢
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      相关资源
      最近更新 更多