【问题标题】:In Java, can I inherit a class supplied by a type parameter?在 Java 中,我可以继承由类型参数提供的类吗?
【发布时间】:2015-11-17 09:07:21
【问题描述】:

在 java 中,我可以或多或少地做一些这样的事情吗?以及如何?

public class SomeGenericClass<T> extends T{
}

【问题讨论】:

  • 不,你不能。你真正想做什么?你的用例是什么?
  • 为什么投反对票?这个问题不是很清楚,不是吗?我会认为,研究起来很棘手。仅仅因为答案是(显然)“不,你不能那样做”,并不意味着“我可以这样做吗?”是个坏问题。 (我无法完全理解为什么人们会认为自己想要这样做,但是......)
  • @T.J.Crowder 我想说,这个问题没有个人努力去尝试和弄清楚。
  • sigh 又是一问一答。 Muhammad, SO 是一个非常活跃的地方。当你提出问题时,停留几分钟,这样你就可以回答上面 Tunaki 提出的问题。

标签: java templates generics inheritance type-parameter


【解决方案1】:

我认为这是来自 JLS (§8.1.4) 的相关引用:

ClassType [在extends 子句中提供] 必须命名一个可访问的(第 6.6 节)类类型,否则会发生编译时错误。

(关于可访问性的部分无关紧要)。

类类型是not the same thing as a type variable (§4.3)T 是),因此尝试这样做会导致编译时错误。

【讨论】:

    【解决方案2】:

    由于多种原因,您不能使用public class SomeGenericClass&lt;T&gt; extends T

    类型擦除会将T擦除为Object。说public class SomeGenericClass&lt;T&gt; extends Object毫无意义,因为Object已经是所有类型的基类。

    想象一下,如果它被允许并且我做了类似public class SomeGenericClass&lt;T extends Comparable&gt; extends T 的事情,类型擦除将把它变成public class SomeGenericClass&lt;Comparable&gt; extends Comparable 但接口实现而不是扩展。

    【讨论】:

      【解决方案3】:
      public class SomeGenericClass<T> extends T{
      }
      

      您必须更好地理解泛型。 SomeGenericClass 是一个模板(C++ 术语)。事实上,它对编译器没有任何意义。你不能写

      SomeGenericClass<T> obj = new SomeGenericClass<T>() // this is invalid
      

      相反,您需要提供类型属性。此信息补充了@Andy Turner 提供的上述答案

      【讨论】:

      • "this is invalid" 只是因为类声明无效(并且缺少分号)。如果类定义有效,&lt;T&gt; void foo() { SomeGenericClass&lt;T&gt; obj = new SomeGenericClass&lt;T&gt;(); } 之类的东西就会有效。
      • 我同意。但我的意图是暗示一般的无效用法。谢谢你纠正我。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 2015-06-21
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 2018-10-24
      • 2021-01-14
      相关资源
      最近更新 更多