2012-11-15 69 views
0

我有外部泛型类,它有一些内部类,为此我想使用泛型类外部类。Java泛型类,使用外部类参数的内部类

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

实施例:

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

内的在FUNC的使用()是原始的,它应该是内在新=内(); –

+3

@AllenParslow:错了。 'Inner'不是通用的。 – SLaks

+0

'E'已经可以提供给你的班级。 –

回答

2

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

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

由于SLaks explainedfunc将在所有情况下做出时髦的事情,除非它在Outer<CharSequence>上被调用:例如,当在Outer<String>上呼叫时,它将向ArrayList<String>添加CharSequence

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

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

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

看来你试图从你面对的一些特定问题创建一个通用的问题。如果你描述了你正在尝试做的和失败的事情,你会有更好的机会在这里解决它。

4

这基本上是不安全的。

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

如果你有<E extends CharSequence>集合,唯一的类型安全的东西你可以把收藏是E一个实例(或扩展E,或null类)。

+0

这里实际的类型并不相关,String/Charsequence就是例子,我在我的项目中使用其他类的层次结构,在这里我想使其工作。 –

+0

@mice:这仍然是不安全的。 'String'就是一个例子。看到我的最后一段。 – SLaks

-3
class Inner extends ArrayList<CharSequence>{ 
} 
+1

这不是他想要的。 – SLaks