Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型类,使用外部类参数的内部类_Java_Generics - Fatal编程技术网

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

Java泛型类,使用外部类参数的内部类,java,generics,Java,Generics,我有一个外部泛型类,它有一些内部类,我想使用外部类的泛型类型 但是,我不明白如何正确使用泛型参数 例如: class Outer<E extends CharSequence>{ class Inner extends ArrayList<E>{ } void func() { ArrayList<CharSequence> al = new ArrayList<CharSequence>(); al.a

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

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

例如:

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
   }
}
类外部{
类内部扩展ArrayList{
}
void func(){
ArrayList al=新的ArrayList();
al.add(“abc”);//好的
CharSequence a=al.get(0);//确定
内部输入=新内部();
in.add(“abc”);//错误:类型ArrayList中的方法add(E)不适用于参数(字符串)
CharSequence b=in.get(0);//确定
}
}
如何声明内部类以使用外部类的相同泛型类型? 谢谢

编辑+解决方案:

最后我实现了我想要的,下面是示例结果:

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);
   }
}
抽象类MyGenericClass{
类列表扩展了ArrayList{};
列表=新建列表();
}
最终类ClassInstance扩展了MyGenericClass{
};
公共班机{
公共静态void main(字符串[]args){
ClassInstance c=新ClassInstance();
c、 列表。添加(“abc”);
字符串s=c.list.get(0);
}
}
我的要求是要有泛型类,并在其中包含泛型容器,它将使用与其父类相同的类型参数


注意:CharSequence/String是使用的示例参数,我的实际用法不同。

这根本不安全

如果我做了一个
外部
,会发生什么情况?
您最终将向
数组列表添加
字符串


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

,这从根本上说是不安全的

如果我做了一个
外部
,会发生什么情况?
您最终将向
数组列表添加
字符串

如果您有一个
的集合,那么可以放入该集合中的唯一类型安全对象是
E
(或扩展
E
的类,或
null
)的实例。

类内部扩展ArrayList{
}
类内部扩展ArrayList{
}
如何声明内部类以使用外部类的相同泛型类型

内部
已使用与
外部
相同的泛型类型。问题是
func
没有使用它,它使用的是
CharSequence

As SLaks
func
在所有情况下都会做一些古怪的事情,除了在
外部
上调用时:例如,在
外部
上调用时,它会将
字符序列
添加到
数组列表

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

void func(E e) 
{
    Inner in = new Inner();
    in.add(e);
}          
这样做是对的。因此编译器允许这样做

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

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

内部
已使用与
外部
相同的泛型类型。问题是
func
没有使用它,它使用的是
CharSequence

As SLaks
func
在所有情况下都会做一些古怪的事情,除了在
外部
上调用时:例如,在
外部
上调用时,它会将
字符序列
添加到
数组列表

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

void func(E e) 
{
    Inner in = new Inner();
    in.add(e);
}          
这样做是对的。因此编译器允许这样做


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

Inner in func()的用法是原始的,它应该是Inner in=new Inner()@阿连帕斯洛:错了
Internal
不是泛型。
E
已可用于您的内部类。您试图执行的操作非常不清楚。当然,
in.add(“abc”)
失败,
“abc”
不是
E
类型(至少就编译器而言,这不是C++)。因此,看起来您应该创建一个
Inner
而不是
func
Inner-in-func()的用法是原始的,它应该是Inner-in=new-Inner()@阿连帕斯洛:错了
Internal
不是泛型。
E
已可用于您的内部类。您试图执行的操作非常不清楚。当然,
in.add(“abc”)
失败,
“abc”
不是
E
类型(至少就编译器而言,这不是C++)。因此,看起来您应该创建一个
内部
而不是
func内部
实际类型在这里不相关,String/Charsequence是示例,我在我的项目中使用其他类层次结构,我想在其中执行此操作。@mice:这仍然不安全<代码>字符串
只是一个例子。请参阅我的最后一段。实际类型在这里不相关,String/Charsequence是示例,我在项目中使用其他类层次结构,我想在其中实现这一点。@mice:这仍然不安全<代码>字符串
只是一个例子。见我的最后一段。