S是否将S的ArrayList扩展为语言中的有用构造或仅仅是语法副作用

时间:2017-02-02 22:13:54

标签: java generics generic-method

是否可以将除null之外的任何内容添加到此s1中? (并安全地分配到临时)

<S extends ArrayList<S>>

语言中的有用构造还是语法副作用?我是否正确地将S解释为只能保存ArrayLists的ArrayLists的ArrayLists等对象的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);
    }
}

1 个答案:

答案 0 :(得分:3)

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

s1.add(s1);
s1.add(s1.get(0));

您知道范围内没有其他对象满足S extends ArrayList<S>约束,因为类型参数S仅在此范围内声明。 这就是为什么在方法签名中不在一个地方使用它的情况下为方法定义泛型类型参数被认为是不好的做法。