Java泛型类,使用外部类的参数的内部类

时间:2012-11-15 19:02:25

标签: java generics

我有外部泛型类,它有一些内部类,我想使用泛型类的外部类。

但是,我不明白如何正确使用通用参数。

示例:

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是使用的示例参数,我的实际用法是不同的。

3 个答案:

答案 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>{
 }