gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:31:31 26 4
gpt4 key购买 nike

以下代码是我希望实现的示例。不幸的是,如果不在函数 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com