我有外部泛型类,它有一些内部类,我想使用泛型类的外部类。
但是,我不明白如何正确使用通用参数。
示例:
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是使用的示例参数,我的实际用法是不同的。
答案 0 :(得分:4)
这基本上是不安全的。
如果我制作Outer<StringBuilder>
会发生什么?
您最终会向String
添加ArrayList<StringBuffer>
。
如果您有<E extends CharSequence>
的集合,那么您可以在该集合中添加的唯一类型安全的东西是E
的实例(或扩展E
的类,或{ {1}})。
答案 1 :(得分:2)
如何声明内部类使用相同泛型类型的外部类?
Inner
已使用与Outer
相同的通用类型。问题是func
没有使用它,它正在使用CharSequence
。
由于SLaks explained func
会在所有情况下执行时髦的事情,除非在Outer<CharSequence>
上调用它:在Outer<String>
上调用时,它会向CharSequence
添加ArrayList<String>
。
现在,如果func
已经有一个具体类型的对象:
void func(E e)
{
Inner in = new Inner();
in.add(e);
}
它会做正确的事情。所以编译器允许这样做。
您似乎尝试根据您面临的某些特定问题创建一般问题。如果您描述了您要做的事情并且失败了,那么您将有更好的机会在此处解决它。
答案 2 :(得分:-3)
class Inner extends ArrayList<CharSequence>{
}