gpt4 book ai didi

java - 访问 "nested"通用类型

转载 作者:行者123 更新时间:2023-12-01 15:00:36 29 4
gpt4 key购买 nike

我有两个使用泛型类型的类(A、B)。我的问题是 - 使用 B 内部的第一个泛型类型 (TA) 的最佳方法是什么?这是简化的示例:

public class A<TListItemsType>
{
List<TListItemsType> list = new LinkedList<TListItemsType>();
public List<TListItemsType> getList()
{
return list;
}
}
public class B<TContainderType extends A>
{
TContainderType temp = null;
public B(TContainderType cont)
{
temp=cont;
}
public void DoWork()
{
for (TListItemsType item : temp.getList())
{
System.out.println(item);
}
}
}

我已经尝试了建议的解决方案 here -

public class B<TContainderType extends A<TListItemsType>>
{
TContainderType temp = null;
public B(TContainderType cont)
{
temp=cont;
}
public void DoWork()
{
for (TListItemsType item : temp.getList())
{
System.out.println(item);
}
}
}

只要使用预定义类型(例如 Integer 或 String),它就可以工作,遗憾的是,这不起作用,因为编译器无法将泛型识别为类名。

因此,进一步尝试配置另一个泛型类型,然后在扩展中使用它:

public class B<TListItemsType, TContainderType extends A<TListItemsType>>
{
TContainderType temp = null;
public B(TContainderType cont)
{
temp=cont;
}
public void DoWork()
{
for (TListItemsType item : temp.getList())
{
System.out.println(item);
}
}
}

它确实有效,但闻起来不太对劲。是否有另一种方法可以使用另一种泛型类型中使用的泛型类型?

最佳答案

你使用B<TListItemsType, TContainderType extends A<TListItemsType>>的方式做到了我觉得不错...

这有意义的原因是您的 B类现在确实需要两个参数来描述它:TListItemsTypeTContainderType 。事实上,您甚至在使用 TListItemsType明确地在您的 DoWork() 中里面的功能B 。因此,您需要将其作为参数传递是公平的。否则编译器甚至不知道 DoWork() 中的含义。函数,您也可以像这样编写类定义:

public class B<TWorkItemType, TContainderType extends A<TWorkItemType>>
{
//...

public void DoWork()
{
for (TWorkItemType item : temp.getList())
{
System.out.println(item);
}
}
}

(请注意,我完全重命名了类型,但只是在 B 中,而不是在 A 中!)

如果它只是要求您使用相同的名称 TListItemsTypeA 的定义中所使用的,您可以使用泛型做的事情会非常有限。例如,您不能接受一种类型 extends List<E>另一个扩展 Enum<E> ,因为这两个都使用了 <E>作为他们的通用标识符。

我希望现在闻起来好一些......:)

关于java - 访问 "nested"通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13706919/

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