Java 为什么可以';不能在列表中添加字符串吗?

Java 为什么可以';不能在列表中添加字符串吗?,java,generics,Java,Generics,正如我们所知,若我们为列表声明泛型类型,我们可以在列表中添加字符串和整数。但是代码似乎没有把字符串加起来。有什么问题我不明白 class GHJ{String s;GHJ(String s){this.s=s;}} class DFR{ public static void main(String[] g){ List<? extends Object> list=new ArrayList(); list.add((new String("

正如我们所知,若我们为列表声明泛型类型,我们可以在列表中添加字符串和整数。但是代码似乎没有把字符串加起来。有什么问题我不明白

class GHJ{String s;GHJ(String s){this.s=s;}}

class DFR{
    public static void main(String[] g){
        List<? extends Object> list=new ArrayList();
        list.add((new String("ffg")));// compiler error
        list.add("df");// compiler error
        list.add("sdd");// compiler error
        list.add(new GHJ("dff"));// compiler error
        String s= list.get(0);// compiler error
        System.out.println(list+" "+s);
    }   
}
class GHJ{String s;GHJ(String s){this.s=s;}
类DFR{
公共静态void main(字符串[]g){

列表您需要从对象强制转换字符串,如下所示:

String s = (String)list.get(0);

正确的方法是使用泛型

创建您的列表,如:

List<String> list = new ArrayList<String>();

为什么它会把字符串加起来? 它无法编译,因为需要强制转换:

String str = (String)list.get(0);

您已经告诉编译器列表中的类型是扩展对象的类型。然后您将内容添加到列表中,并尝试将其取出。所有编译器都可以知道您取出的内容将扩展对象,而不是它一定是字符串。您需要告诉编译器您正在从列表中取出字符串

如果你说

Object a= new String("blah");
String s;
您需要将a转换为字符串才能将其分配给s

s= (String) a;
如果您这样做,您的示例中会发生什么

String s = list.get(3);
您将您的
新GHJ(“dff”)
放在哪里


编译器如何知道每个位置的对象类型?

在您的情况下,您无需将列表设置为泛型。只需使用

List list = new ArrayList();

这将创建一个对象类型列表。

只是为了补充Carlos的答案:

建议阅读Java语言指南->

以及更全面的报道:


您可以,但只能使用非类型(摆脱

<? super String> 
或者通过为泛型参数查找公共超类(在本例中,仅为对象)

List<Object> x = new List<Object>(); x.add(new Object()); x.add("blah!");
List x=newlist();x.add(newobject());x.add(“废话!”);

您可以使用技巧将元素填充到列表中,绕过泛型类型检查,但这是非常糟糕的Juju。

列表属于
列表类型,通配符将使您在这里陷入困境,因为它没有执行您希望它执行的操作。通配符通常在您需要引用某组泛型时使用


例如,如果您想让用户给您一个包含任何类型对象的集合,那么您的方法可以采用
集合如果您向列表中添加不同的类型,您必须告诉编译器您从列表中得到的是哪种类型,您无法回避


您是否可以为每种类型的对象保留单独的列表,或者保留一个包含单个类型列表的映射?然后您可以按类型获取每个列表,并且列表中的所有元素都将是相同的类型?

是的,您可以在列表中添加列表和对象,但唯一的方法是使用非类型列表。在这种情况下,您可以松开类型信息,必须手动将要从列表中取出的对象转换回其原始类型

您可以使用来检查可以投射对象的类型,但这特别难看


问题是:你真的需要把字符串和对象放在同一个列表中吗?我觉得这就像是一种代码味道。

在这个例子中还有这样的代码:list.add(new GHJ(“dff”));。那不是字符串,所以你不能添加它。你的列表示例“不添加字符串”是什么意思?你希望这段代码做什么?是的,我知道我可以使用非类型化列表添加对象和字符串。但是我想从对象中获取值(字符串或int等)。你无法回避转换结果。
List x = new List(); x.add(new Object()); x.add("blah!");
List<Object> x = new List<Object>(); x.add(new Object()); x.add("blah!");
List<Object> list = new ArrayList<Object>();