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>();