0

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

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

例子:

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

4

3 回答 3

4

这从根本上来说是不安全的。

如果我做一个会发生什么Outer<StringBuilder>
你最终会添加一个String到一个ArrayList<StringBuffer>.

如果您有一个 的集合<E extends CharSequence>,那么您可以在该集合中放入的唯一类型安全的东西是E (或扩展的类E,或null)的一个实例。

于 2012-11-15T19:05:58.553 回答
2

如何声明内部类以使用相同的泛型类型的外部类?

Inner 已经使用与 相同的泛型类型Outer。问题是func没有使用它,它正在使用CharSequence.

正如 SLaks解释 func的那样,在所有情况下都会做一些时髦的事情,除了在 an 上调用它Outer<CharSequence>时:例如,当它被调用时,Outer<String>它会将 a 添加CharSequence到 anArrayList<String>中。

现在,如果func 已经有一个具体类型的对象:

void func(E e) 
{
    Inner in = new Inner();
    in.add(e);
}          

它会做正确的事。所以编译器允许这样做。

您似乎试图从您面临的某些特定问题中创建一个通用问题。如果您描述了您正在尝试做的事情并且失败了,您将有更好的机会在这里解决它。

于 2012-11-15T20:14:45.567 回答
-3
 class Inner extends ArrayList<CharSequence>{
 }
于 2012-11-15T19:24:44.330 回答