Java Generics扩展了类参数
我收到一个错误,我的程序中有这个结构
public interface Shapes{ //methods here } public class ShapeAction implements Shapes{ //Methods and implementations here } public class Circle extends ShapeAction{ //Some methods here }
错误指向类Circle扩展Shapes < T >,其中显示“T无法解析为类型”。 如果我将T设置为字符串,则错误将消失,但这也意味着我只能使用一种数据类型。 我应该把什么放在中,以便我可以使用任何数据类型(String,int,double等)或者我做错了吗?
有两个不同的概念。 当你写作
public class ShapeAction
这意味着您正在创建一个类,在实例化时,将使用某个类进行参数化。 你当时不知道它会是什么,所以你就像T
。
但是当你写作
public class Circle extends ShapeAction
这意味着您希望Circle
成为使用类型T
参数化的ShapeAction
的子类。 但是什么是T
? 编译器无法分辨:你声明Circle
没有任何类型变量。
你有两个选择。 你也可以使Circle成为通用的:
public class Circle extends ShapeAction
这样,当您创建Circle
的新实例时,您可以指定它使用的类型,并且这将扩展到超类。
如果你想指定ShapeAction可以是任何类型,但不使子类通用,该怎么办? 使用Object
:
public class Circle extends ShapeAction
这样, Circle
保持非generics,但您可以将任何数据类型与超类一起使用。
你试过这个吗?
public class Circle extends ShapeAction { //Some methods here }
除非先定义,否则编译器无法告诉extends ShapeAction
T
参数的含义。
最后,当您使用对Circle
的引用时,您必须为T
提供一个类型参数,该参数将级联到此类型的所有其他外观。
Circle myInt;
将导致编译器将代码解释为:
public class Circle extends ShapeAction { //Some methods here }
等等,对于类层次结构的其余部分。
因此,如果您没有在Circle
类中定义类型T
编译器没有办法告诉ShapeAction
的参数化类型,这很可能是问题的根源。
您还没有真正向我们展示足够的代码来告诉您要实现的目标,但总的来说:
如果要创建一个可以接受多种类型参数的方法 ,则需要参数化方法 ,而不是整个类。
public Shape takeAction(T argument);
显然,这并没有真正提供很多编译时类型安全性,您仍然可能必须在运行时手动将参数解析为某些受限类型的子集。