作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下代码是我希望实现的示例。不幸的是,如果不在函数 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/
我是一名优秀的程序员,十分优秀!