Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型扩展了类参数_Java_Generics_Extends - Fatal编程技术网

Java泛型扩展了类参数

Java泛型扩展了类参数,java,generics,extends,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 } 公共界面形状

我收到一个错误,我的程序中有这个结构

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
}
公共界面形状{
//这里的方法
}
公共类ShapeAction实现形状{
//这里的方法和实现
}
公共类圈扩展形状{
//这里有一些方法
}
错误是指向类Circle extends Shapes,其中表示“T无法解析为类型”。如果我将T设置为string,错误将消失,但这也意味着我只能使用一种数据类型。我应该在中添加什么以便可以使用任何数据类型(字符串、int、double等),还是我这样做的方式不对?

您尝试过吗

public class Circle<T> extends ShapeAction<T>{
//Some methods here
}
将导致编译器将代码解释为:

public class Circle<Integer> extends ShapeAction<Integer>{
    //Some methods here
}
public类循环扩展了ShapeAction{
//这里有一些方法
}
依此类推,对于类层次结构的其余部分


因此,如果您没有在类
圆圈中定义类型
T
。编译器没有办法告诉我们
ShapeAction的参数化类型,这很可能是问题的根源。

您没有向我们展示足够的代码来告诉我们您想要实现什么,但一般来说:

如果要生成一个可以接受多种类型参数的方法,则需要参数化该方法,而不是整个类

public <T> Shape takeAction(T argument);
public-Shape-takeAction(T参数);

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

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

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

你有两个选择。您也可以将圆设置为通用:

public class Circle<T> extends ShapeAction<T>

这样,
Circle
保持非泛型,但可以在超类中使用任何数据类型。

在Shapes和ShapeAction中使用T的位置是什么?谢谢,但我想问一下,为什么我需要在类Circle中定义另一个?我认为类Circle已经扩展了ShapeAction,它有这样的功能?@dimas它根本不以这种方式工作,参数化类型并不像您所暗示的那样被继承。您好,谢谢您的回答,我只是在尝试泛型和多态性。但我在这两个类中插入的方法不多,包括接口。我只是想看看我是否可以扩展类Circle的功能和ShapeAction的功能,它有类型。我想如果我这样做,我可以使用ShapeAction中的方法,它有类型,我可以显式地声明它们在Circle类中应该是什么类型。
public class Circle<T> extends ShapeAction<T>
public class Circle extends ShapeAction<Object>