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); 

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