【问题标题】:Java Generics Extends Class ParameterJava 泛型扩展类参数
【发布时间】:2012-07-24 05:05:36
【问题描述】:

我收到一个错误,我的程序中有这个结构

public interface Shapes<T>{
//methods here
}

public class ShapeAction<T> implements Shapes<T>{
//Methods and implementations here
}

public class Circle extends ShapeAction<T>{
//Some methods here
}

错误指向类 Circle extends ShapesT>,它说“T 无法解析为类型”。如果我将 T 设置为字符串,错误就会消失,但这也意味着我只能使用一种数据类型。我应该在 中放什么以便我可以使用任何数据类型(String、int、double 等)还是我做错了?

【问题讨论】:

  • 您在 Shapes 和 ShapeAction 中的什么地方使用 T?

标签: java generics extends


【解决方案1】:

有两个不同的概念。当你写

public class ShapeAction<T>

这意味着您正在创建一个类,该类在实例化时将使用某个类进行参数化。你当时不知道它会是什么,所以你把它称为T

但是当你写的时候

public class Circle extends ShapeAction<T>

这意味着您希望Circle 成为ShapeAction 的子类,参数化类型为T。但是T 是什么?编译器无法判断:您声明 Circle 时没有任何类型变量。

你有两个选择。您也可以将 Circle 设为通用:

public class Circle<T> extends ShapeAction<T>

这样,当您创建 Circle 的新实例时,您可以指定它使用的类型,这会扩展到超类。

如果您想指定 ShapeAction 可以是任何类型,但又不使子类成为泛型,该怎么办?使用Object

public class Circle extends ShapeAction<Object>

这种方式Circle 保持非泛型,但您可以将任何数据类型用于超类。

【讨论】:

    【解决方案2】:

    你试过了吗?

    public class Circle<T> extends ShapeAction<T>{
    //Some methods here
    }
    

    除非您先定义,否则编译器无法判断 T 参数在 extends ShapeAction&lt;T&gt; 中的含义。

    最终,当您使用对Circle 的引用时,您必须为T 提供一个类型参数,该参数将级联到此类型的所有其他外观。

    Circle<Integer> myInt;
    

    将导致编译器将代码解释为:

    public class Circle<Integer> extends ShapeAction<Integer>{
        //Some methods here
    }
    

    对于类层次结构的其余部分,依此类推。

    因此,如果您没有在类 Circle 中定义类型 T。编译器没有办法告诉ShapeAction 的参数化类型,这很可能是问题的根源。

    【讨论】:

    • 谢谢它的工作,但我想问为什么我需要在类 Circle 中定义另一个 ?我认为 Circle 类已经扩展了具有这个 的 ShapeAction ?
    • @dimas 它根本不起作用,参数化类型不会像您暗示的那样被继承。
    【解决方案3】:

    您并没有真正向我们展示足够的代码来说明您想要实现的目标,但总的来说:

    如果你想创建一个可以接受多种类型参数的方法,你需要参数化方法,而不是整个类。

    public <T> Shape takeAction(T argument);
    

    显然,这并不能真正提供太多的编译时类型安全性,您可能仍然需要在运行时手动将参数解析为某些受限类型的子集。

    【讨论】:

    • 您好,感谢您的回答,我只是想尝试泛型和多态性。但是我在这两个类中插入的方法并不多,包括接口。我只是想检查我是否可以使用类型为 的 ShapeAction 扩展 Class Circle 的功能。我认为如果我这样做,我可以使用 ShapeAction 中具有类型 的方法,我可以在其中显式声明它们应该在 Circle 类中是哪种类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多