Java Generics扩展了类参数

dim*_*mas 2 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
}
Run Code Online (Sandbox Code Playgroud)

错误指向类Circle扩展Shapes < T >,其中显示"T无法解析为类型".如果我将T设置为字符串,则错误将消失,但这也意味着我只能使用一种数据类型.我应该把什么放在<>中,以便我可以使用任何数据类型(String,int,double等)或者我做错了吗?

Mal*_*olm 6

有两个不同的概念.当你写作

public class ShapeAction<T>
Run Code Online (Sandbox Code Playgroud)

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

但是当你写作

public class Circle extends ShapeAction<T>
Run Code Online (Sandbox Code Playgroud)

这意味着您希望Circle成为ShapeAction参数化类型的子类T.但是什么T呢?编译器不能告诉你:你声明Circle没有任何类型变量.

你有两个选择.你也可以使Circle成为通用的:

public class Circle<T> extends ShapeAction<T>
Run Code Online (Sandbox Code Playgroud)

这样,当您创建一个新实例时,Circle请指定它使用的类型,并且这将扩展到超类.

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

public class Circle extends ShapeAction<Object>
Run Code Online (Sandbox Code Playgroud)

这种方式Circle保持非泛型,但您可以将任何数据类型与超类一起使用.