【问题标题】:extending a class with a generics type, java用泛型类型扩展一个类,java
【发布时间】:2011-08-26 08:41:49
【问题描述】:

我正在尝试在 java 中执行以下操作:

public class ClassName<E> extends E

但是,这样做,我得到了:

error: unexpected type

难道仅仅是这样,java就不能做到这一点吗? - 如果是这样,我将如何实现这种效果? 它在 C++ 中完美地工作,与模板一样:

template<typename E>
class ClassName: public E

我真正想要实现的,是能够以这种方式将类链接在一起,实现java中多重继承的效果。

【问题讨论】:

    标签: java templates generics inheritance multiple-inheritance


    【解决方案1】:

    无论好坏,Java 中没有多重继承。 Java 中的泛型与 C++ 中的差异很大。他们只是给你编译类型安全。在运行时,泛型信息会被删除。

    【讨论】:

    【解决方案2】:

    在 C++ 中,模板具有在编译时创建不同类的效果,即对于每个 E,您将获得不同版本的 ClassName

    在 Java 中,您有一个具有该名称的类,而泛型类型仅用于编译时的类型检查。因此,Java 不能让您从 E 类型扩展,因为在这种情况下,编译器必须创建多个实例。

    此外,泛型类型也可以是接口,class ClassName extends Serializable 根本无法编译。 :)

    【讨论】:

    • 不知何故偶然发现了这个老问题,不知道为什么这不是公认的答案。
    【解决方案3】:

    Java 做不到——这是因为类型擦除。编译 Java 类时,泛型类型 (E) 更改为某个具体的类/接口 - 编译器必须能够确定类型是什么。此外,Java 不支持多重继承 - 类只能扩展一个类(但它可以实现多个接口)。

    【讨论】:

      【解决方案4】:

      你不能这样做,因为E 没有定义类型/类。为了实现多重继承,您可以使用interfaces. 这是合法的方式..

      【讨论】:

      • 但是我必须在整个地方复制相同的代码,这是不好的做法吗?
      • @Skeen,在一个类中实现所有这些方法,并在需要这些方法的类中扩展它。或者你也可以使用对象来调用已经定义的方法。
      • 问题是,我将在几个已经扩展的类中需要这个类,所以我这就是我想做这个的原因。
      • Petar 提供的链接给了我一个解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多