繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM