Java 泛型扩展类参数

标签 java generics extends

我收到错误,并且我的程序中有此结构

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 Shapes<T> ,其中显示“T 无法解析为类型”。如果我将 T 设置为字符串,错误就会消失,但这也意味着我只能使用一种数据类型。我应该在 <> 中放入什么,以便我可以使用任何数据类型(String、int、double 等),或者我是否以错误的方式执行此操作?

最佳答案

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

public class ShapeAction<T>

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

但是当你写

public class Circle extends ShapeAction<T>

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

你有两个选择。您也可以使 Circle 变得通用:

public class Circle<T> extends ShapeAction<T>

这样,当您创建Circle的新实例时,您可以指定它使用的类型,并且这会扩展到父类(super class)。

如果您想指定 ShapeAction 可以是任何类型,但不使子类通用,该怎么办?使用对象:

public class Circle extends ShapeAction<Object>

这样 Circle 保持非泛型,但您可以在父类(super class)中使用任何数据类型。

关于Java 泛型扩展类参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11655280/

相关文章:

java - 为什么从接口(interface)执行方法时会将参数转换为 Object(或扩展 YourObject)?

JavaScript:动态扩展原型(prototype)是一种不好的做法吗?

java - 如何在Android中使用java将JSONObject结果存储到BeanClass中?

java - 可添加编辑文本android Material d

当我尝试提供自己的 AnySequence 实现时,Swift 无法推断泛型类型

c# - .Net - 序列化对象

java - 扩展对象隐式

Java通过匿名类强制第三方类上的接口(interface)

java - getStacktrace(),setStackTrace()有什么用?我无法理解这个函数的需要是什么?

java - 从连接池获取数据库连接