Java Generics扩展了类参数

时间:2012-07-25 17:27:52

标签: 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
}

错误指向类Circle扩展Shapes&lt; T &gt;它说“T无法解析为某种类型”。如果我将T设置为字符串,则错误将消失,但这也意味着我只能使用一种数据类型。我应该把什么放在&lt;&gt;里面所以我可以使用任何数据类型(String,int,double等)或者我做错了吗?

3 个答案:

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

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