当前位置: 首页 > 面试题库 >

Java泛型扩展了类参数

微生俊捷
2023-03-14
问题内容

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

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 < T >类,其中指出“
T无法解析为类型”。如果将T设置为字符串,错误将消失,但这也意味着我只能使用一种数据类型。我应该在<>中放入什么,以便可以使用任何数据类型(字符串,整数,双精度型等),或者这样做是错误的?


问题答案:

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

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保持非通用性,但是您可以在超类中使用任何数据类型。



 类似资料:
  • 问题内容: 我正在尝试重构M类型确实扩展了任何内容的类和子类集,即使我们知道它必须是某种类型的子类也是如此。该类型已参数化,我希望其参数化类型可用于已经具有M值的子类。 有什么方法可以定义此类,而不必在参数列表中包括冗余的K和V泛型类型。我希望能够使编译器从子类映射到的M中推断出它们。 换句话说,我希望类声明看起来像这样: 从M的定义可以推断出K和V的类型。 问题答案: 问题在于,它们并没有真正地

  • 问题内容: 您如何进行这项工作: 不做 编辑 为什么这不起作用? 我正在将编译器消息标记为错误。 问题答案: Reimeus已经指出,您在编辑中要求的内容是不可能的。我只想扩展一下原因。 人们会认为您可以使用以下内容: 实际上,这就是我第一次看到这篇文章时想到的。但这实际上会导致编译器错误: 类型变量不能跟其他界限 为了帮助我解释原因,我想引用Victor Rudometov在OracleBlog

  • 问题内容: 我有一个方法以a 作为参数。 在中,我如何知道a 是还是a 是? 问题答案: 根据用户omain的回答“如果使用<?>,则意味着您将不会在任何地方使用参数化类型。要么转到特定类型(在您的情况下,似乎是),要么转到非常通用的“ 另外,我相信如果您使用问号,编译器将在运行时(类型;有效Java的第119页)消除类型不匹配的情况,绕过擦除,并有效地消除了使用泛型类型所带来的好处? 要回答发问

  • 问题内容: 是否可以为特殊/构造的泛型类型扩展泛型类?我想使用一种方法来扩展Int Arrays,以计算其元素的总和。 例如 问题答案: Swift 5.x:

  • 问题内容: 给定以下示例(将与匹配器结合使用): 这不能与以下内容的方法签名一起编译: 编译器错误消息是: 但是,如果我将方法签名更改为: 然后编译工作。 所以三个问题: 为什么当前版本完全不编译?尽管我在这里模糊地理解了协方差问题,但如果需要的话,我当然无法解释。 将方法更改为有什么缺点吗?如果这样做,还有其他情况会中断吗? 在中通用化方法有什么意义吗?该级似乎并不需要它,因为JUnit的调用方

  • 问题内容: 我试图在这样的泛型类中创建一个常规的RuntimeException: 这段代码使我对这个词的错误说法。 这个RuntimeException与我的类通用有什么关系? 问题答案: Java不允许Throwable的通用子类。而且,非静态内部类可以通过其外部类的类型参数有效地进行参数化(请参见Oracle JDK Bug 5086027 )。例如,在您的示例中,内部类的实例具有form类