[英]Java generic class, inner class using parameter of outer class
我有一个具有某些内部类的外部泛型类,为此,我想使用外部类的泛型类型。
但是,我不明白如何正确使用通用参数。
例:
class Outer<E extends CharSequence>{
class Inner extends ArrayList<E>{
}
void func() {
ArrayList<CharSequence> al = new ArrayList<CharSequence>();
al.add("abc"); // OK
CharSequence a = al.get(0); // OK
Inner in = new Inner();
in.add("abc"); // Error: The method add(E) in the type ArrayList<E> is not applicable for the arguments (String)
CharSequence b = in.get(0); // OK
}
}
如何声明内部类使用与外部类相同的泛型? 谢谢
编辑+解决方案:
终于我达到了想要的效果,这是示例结果:
abstract class MyGenericClass<E extends CharSequence>{
class TheList extends ArrayList<E>{};
TheList list = new TheList();
}
final class ClassInstance extends MyGenericClass<String>{
};
public class Main{
public static void main(String[] args){
ClassInstance c = new ClassInstance();
c.list.add("abc");
String s = c.list.get(0);
}
}
我的要求是要有通用类,也要有通用容器,该容器将使用与其父类相同的类型参数。
注意:CharSequence / String是使用的示例参数,我的实际用法有所不同。
从根本上讲这是不安全的。
如果我制作Outer<StringBuilder>
会发生什么?
您最终将向String
添加一个ArrayList<StringBuffer>
。
如果您有一个<E extends CharSequence>
的集合,则可以放入该集合的唯一类型安全的东西是E
的实例(或扩展E
的类,或者为null
)。
如何声明内部类使用与外部类相同的泛型?
Inner
已经使用与Outer
相同的通用类型。 问题在于func
未使用它,而是在使用CharSequence
。
正如SLaks 解释的那样, func
在所有情况下都会做时髦的事情,除非在Outer<CharSequence>
上调用它:例如,在Outer<String>
上调用时,它将为ArrayList<String>
添加一个CharSequence
。
现在,如果func
已经具有该具体类型的对象:
void func(E e)
{
Inner in = new Inner();
in.add(e);
}
它将做正确的事。 因此,编译器允许这样做。
看来您尝试从遇到的特定问题中创建一个通用问题。 如果您描述了您要做什么而失败了,您将有更多机会在这里解决它。
class Inner extends ArrayList<CharSequence>{
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.