首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将密封类与泛型一起使用?

如何将密封类与泛型一起使用?
EN

Stack Overflow用户
提问于 2021-10-08 06:06:19
回答 1查看 524关注 0票数 7

我有一个父类抽象类和一个采用泛型的子类。

代码语言:javascript
复制
public abstract sealed class Parent<T> permits ChildA, ChildB {}

public non-sealed class ChildA<T extends FileTypeA> extends Parent{}

public non-sealed class ChildB<T extends FileTypeB> extends Parent{}

在父类中,我收到警告:

代码语言:javascript
复制
ChildA is a raw type. References to generic type ChildA<T> 
       should be parameterized

ChildB is a raw type. References to generic type ChildB<T> 
       should be parameterized

在儿童班,我收到警告:

代码语言:javascript
复制
Parent is a raw type. References to generic type Parent<T> 
       should be parameterized

使它们参数化如下:

代码语言:javascript
复制
public abstract sealed class Parent<T> 
    permits ChildA<T extends FileTypeA>, ChildB<T extends FileTypeB> {}

甚至

代码语言:javascript
复制
public abstract sealed class Parent<T> 
    permits ChildA<T>, ChildB<T> {}

给出错误:

代码语言:javascript
复制
Bound mismatch: The type T is not a valid substitute for the 
    bounded parameter <T extends FileTypeA> of the type ChildA<T>

如何删除这些警告和错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-08 08:16:46

警告“父类型是原始类型”与密封类完全无关,因为在extends Parent是泛型类时使用Parent<T>会导致这样的警告,因为泛型是存在的。

你很可能想用

代码语言:javascript
复制
public non-sealed class ChildA<T extends FileTypeA> extends Parent<T> {}

public non-sealed class ChildB<T extends FileTypeB> extends Parent<T> {}

另一个问题似乎是Eclipse的错误,因为我只能在那里再现警告。当我将声明更改为permits ChildA<?>, ChildB<?>时,警告将消失,但您不应该这样做。

Java语言规范permits子句定义为

代码语言:javascript
复制
ClassPermits:
    permits TypeName {, TypeName}

TypeName 是与

代码语言:javascript
复制
TypeName:
    TypeIdentifier
    PackageOrTypeName . TypeIdentifier

PackageOrTypeName:
    Identifier
    PackageOrTypeName . Identifier

这显然导致没有任何类型参数的点分隔标识符序列。一贯地,javac拒绝像permits ChildA<?>, ChildB<?>这样的构造。

换句话说,Eclipse不应该在这里生成警告,更重要的是,不接受permit子句中的参数化类型。最好的选择是等待Eclipse的Java 17支持的修复。您可以向整个@SuppressWarnings("rawtypes")类添加一个Parent,以消除警告,但由于这会影响整个类,所以我不建议这样做。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69491202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档