Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.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 S的扩展数组列表是语言中有用的构造还是语法上的副作用_Java_Generics_Generic Method - Fatal编程技术网

Java S的扩展数组列表是语言中有用的构造还是语法上的副作用

Java S的扩展数组列表是语言中有用的构造还是语法上的副作用,java,generics,generic-method,Java,Generics,Generic Method,是否可以将null以外的任何内容添加到此s1?(并被安全地分配到temp) 是 语言中有用的结构还是语法上的副作用?我将S解释为只能保存ArrayList的ArrayList或ArrayList的ArrayList等对象的ArrayList,对吗 public class Foo{ public static <S extends ArrayList<S>> void f1() { S s1 = (S) new ArrayList<S&g

是否可以将null以外的任何内容添加到此s1?(并被安全地分配到temp)


语言中有用的结构还是语法上的副作用?我将S解释为只能保存ArrayList的ArrayList或ArrayList的ArrayList等对象的ArrayList,对吗

public class Foo{
    public static <S extends ArrayList<S>> void f1() {
        S s1 = (S) new ArrayList<S>();

        // s1.add( ???? );  // can anything be added here other than null?
        S temp = s1.get(0);
    }
}
公共类Foo{
公共静态无效f1(){
s1=(S)新的ArrayList();
//s1.add(????;//除了null之外,可以在这里添加任何内容吗?
S温度=s1.get(0);
}
}

您只能向其添加s1和
null
,而无需将s1或其他对象强制转换为
S

s1.add(s1);
s1.add(s1.get(0));
您知道范围内没有其他对象满足
S extends ArrayList
约束,因为类型参数S仅在此范围内声明。
这就是为什么在方法签名中不在多个位置使用泛型类型参数的情况下为方法定义泛型类型参数被认为是不好的做法的原因。

也许吧?您告诉Java S是ArrayList的一个子类:
我不是在问我知道答案的问题,如果这是您的意思的话。到目前为止,我只发现Null是有效的。我知道我告诉了Java什么是S。我的意思是谁在技术上提供了参数,因为main没有被显式调用。但是你想做什么呢?你问这个问题是出于学术兴趣,还是有一个你想解决的问题?它是作为一个独立问题的一部分被发现的,现在只是好奇而已。现在这不是我想要解决的问题。循环引用是真实的,是这里最有趣的部分。我不完全理解java是如何处理它的。这个S extends ArrayList构造在任何方面都有用吗?还是仅仅是语法方面的影响?@user889742有一些用例-通常不适用于集合-更多类似于本问题中讨论的内容-关于强制转换的观点也很好。我会在问题中详细说明。显然,您可以通过将其放入原始ArrayList引用中来添加任何内容。@user889742自递归类型参数通常用于参数化类中。著名的例子:我还可以将ArrayList类型的其他新对象添加到s1,而不仅仅是将s1添加到自身。
s1.add(s1);
s1.add(s1.get(0));