3

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

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 extends Shapes< T >,它说“T 无法解析为类型”。如果我将 T 设置为字符串,错误就会消失,但这也意味着我只能使用一种数据类型。我应该在 <> 中放什么以便我可以使用任何数据类型(String、int、double 等),还是我做错了?

4

3 回答 3

6

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

public class ShapeAction<T>

这意味着您正在创建一个类,该类在实例化时将使用某个类进行参数化。您当时不知道它会是什么,因此您将其称为T.

但是当你写

public class Circle extends ShapeAction<T>

这意味着您想Circle成为ShapeActiontype 参数化的子类T。但什么是T?编译器无法判断:您声明Circle时没有任何类型变量。

你有两个选择。您也可以使 Circle 通用:

public class Circle<T> extends ShapeAction<T>

这样,当您创建一个新实例时,Circle您可以指定它使用的类型,这会扩展到超类。

如果您想指定 ShapeAction 可以是任何类型,但又不使子类泛型怎么办?使用Object

public class Circle extends ShapeAction<Object>

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

于 2012-07-25T17:38:27.200 回答
4

你试过这个吗?

public class Circle<T> extends ShapeAction<T>{
//Some methods here
}

除非您先定义它,否则编译器无法判断T参数的含义。extends ShapeAction<T>

最终,当您使用对 a 的引用时Circle,您将不得不为 提供一个类型参数T,该参数将级联到该类型的所有其他外观。

Circle<Integer> myInt;

将导致编译器将代码解释为:

public class Circle<Integer> extends ShapeAction<Integer>{
    //Some methods here
}

依此类推,对于类层次结构的其余部分。

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

于 2012-07-25T17:32:06.733 回答
2

您还没有真正向我们展示足够的代码来说明您要实现的目标,但总的来说:

如果你想创建一个可以接受多种类型参数的方法,你需要参数化方法,而不是整个类。

public <T> Shape takeAction(T argument);

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

于 2012-07-25T17:32:56.187 回答