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