我收到错误,并且我的程序中有此结构
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/