java - 了解泛型以及如何避免转换

标签 java generics generic-collections

以下代码是我希望实现的示例。不幸的是,如果不在函数 getElements() 中进行强制转换,就无法编译此代码。

我仍然完全围绕着 Java 泛型,但这似乎是一个相当简单的案例。

如有任何帮助,我们将不胜感激。

import org.junit.Test;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

public class GenericFruitTest
{
    @Test
    public void genericFruit()
    {
        Collection<Apple> apples = new FruitBasket().getApples();
        Collection<Orange> oranges = new FruitBasket().getOranges();

        Collection<Rye> rye = new BreadBasket().getRye();
    }

    class FruitBasket extends Basket<Fruit>
    {
        Collection<Apple> getApples()
        {
            return getElements(Apple.class);
        }

        Collection<Orange> getOranges()
        {
            return getElements(Orange.class);
        }
    }

    private class BreadBasket extends Basket<Bread>
    {
        private Collection<Rye> rye;

        public Collection<Rye> getRye()
        {
            return getElements(Rye.class);
        }
    }

    class Basket<E>
    {

        Map<Class<? extends E>, Collection<? extends E>> classCollectionMap = new HashMap<Class<? extends E>, Collection<? extends E>>();

        <T extends E> Collection<T> getElements(Class<T> elementClass)
        {
            // The following line throws compile time "incompatible types" without cast
            return classCollectionMap.get(elementClass);
        }

    }

    class Rye extends Bread
    {
    }

    class Apple extends Fruit
    {
    }

    class Orange extends Fruit
    {
    }

    class Fruit
    {
    }

    private class Bread
    {
    }
}

最佳答案

Map在这种情况下是从 Class<? extends E> 映射至 Collection<? extends E> .任何Class<? extends E>就编译器而言,可以合法地映射到任何 Collection<? extends E> .

您碰巧总是将与集合匹配的类放入 Map 中这一事实是编译器不知道的 - 因为您可以将任何扩展 E 的类放入 map 中。

不幸的是,在这种情况下您将需要强制转换 - 尽管至少泛型允许您将强制转换放在您的方法中,因此使用该方法的任何人都看不到它。

关于java - 了解泛型以及如何避免转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20934954/

相关文章:

java - ArrayList<Integer> 的内存使用情况

使用 TreeNode 而不是链表的 Java 8 hashmap 实现

java - 返回类型具有泛型的方法对象?

c# - 如何增加分配的内存? {由于内存不足异常,函数评估被禁用。}

c# - 通用集合类型测试

java - 类不继承自扩展至 JComponent 的类

java - 静态查找需要@Transactional但没有它的方法

c# - 通用类型的默认值?

java - 泛型中的父类(super class)型转换(获取泛型类型的泛型父类(super class)型)

c# - Visual C# 2010 Express 中不完整的 System.Collections.Generic