【问题标题】:Is S extends ArrayList of S a useful construct in the language or just a grammar side-effectS 扩展 S 的 ArrayList 是语言中有用的构造还是只是语法的副作用
【发布时间】:2017-02-03 07:15:23
【问题描述】:

可以在这个 s1 中添加除 null 之外的任何内容吗? (并安全地分配给 temp )

<S extends ArrayList<S>>

语言中的有用构造还是只是语法副作用?我将 S 解释为只能包含 ArrayLists 的 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);
    }
}

【问题讨论】:

  • XY Problem 或许?
  • 你告诉 Java S 是 ArrayList 的子类:&lt;S extends ArrayList&lt;S&gt;&gt;
  • 我不是在问我知道答案的事情,如果这就是你的意思。 Null 是我迄今为止发现的所有工作。我知道我告诉 Java S 是什么。我的意思是谁在技术上提供参数,因为 main 没有被显式调用。
  • 但是你想做什么?您是出于学术兴趣而提问,还是您正在努力解决问题?
  • 它是作为一个单独问题的一部分被发现的,现在只是好奇。现在它不是我要解决的问题。循环引用是真实的,是这里最有趣的部分。我完全不明白java是如何对待它的。

标签: java generics generic-method


【解决方案1】:

您只能将 s1 和 null 添加到其中,而不能将 s1 或其他对象强制转换为 S

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

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

【讨论】:

  • 有趣。这个 S extends ArrayList 构造是否以任何方式有用还是只是语法方面的影响?
  • @user889742 有一些用例——通常不是集合——更多类似于这个问题中讨论的东西——What does <R extends TableRecord<R>> mean in Java?
  • 关于选角也不错。我将在问题中指定它。显然,您可以通过将其放入原始 ArrayList ref 中来添加任何内容。
  • @user889742 自递归类型参数常用于参数化类中。著名例子:Enum
  • 我还可以将 ArrayList 类型的其他新对象添加到 s1,而不仅仅是将 s1 添加到自身。
猜你喜欢
  • 2018-12-12
  • 2011-06-03
  • 1970-01-01
  • 2016-05-24
  • 2014-12-29
  • 2021-01-13
  • 2018-08-01
  • 2013-10-24
  • 2019-01-28
相关资源
最近更新 更多