【发布时间】:2014-01-05 14:52:10
【问题描述】:
以下代码是我希望实现的示例。不幸的是,如果没有函数 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
{
}
}
【问题讨论】:
-
这是意料之中的事,因为编译器无法保证 Collection
确实存储在地图中,在 Orange.class 键下。它可以是 Collection 或 Collection 。使用 Basket 唯一可以保证的就是篮子里有水果。 -
有没有办法使用泛型来保证返回的集合中可以预期什么类型的水果?
标签: java generics generic-collections