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

kha*_*eeb 9 java eclipse java-sealed-type java-17

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

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{}
Run Code Online (Sandbox Code Playgroud)

在父类中,我收到警告:

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
Run Code Online (Sandbox Code Playgroud)

在儿童课程中,我收到警告:

Parent is a raw type. References to generic type Parent<T> 
       should be parameterized
Run Code Online (Sandbox Code Playgroud)

让它们像这样参数化:

public abstract sealed class Parent<T> 
    permits ChildA<T extends FileTypeA>, ChildB<T extends FileTypeB> {}
Run Code Online (Sandbox Code Playgroud)

甚至

public abstract sealed class Parent<T> 
    permits ChildA<T>, ChildB<T> {}
Run Code Online (Sandbox Code Playgroud)

给出错误:

Bound mismatch: The type T is not a valid substitute for the 
    bounded parameter <T extends FileTypeA> of the type ChildA<T>
Run Code Online (Sandbox Code Playgroud)

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

Hol*_*ger 11

警告 \xe2\x80\x9c Parent is a raw type \xe2\x80\x9d 与密封类完全无关,因为使用extends ParentwhenParent<T>是泛型类会导致这样的警告,因为泛型存在。

\n

您很可能想使用

\n
public non-sealed class ChildA<T extends FileTypeA> extends Parent<T> {}\n\npublic non-sealed class ChildB<T extends FileTypeB> extends Parent<T> {}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

Java语言规范将该子句定义permits

\n
ClassPermits:\n    permits TypeName {, TypeName}\n
Run Code Online (Sandbox Code Playgroud)\n

TypeName 链接到

\n
TypeName:\n    TypeIdentifier\n    PackageOrTypeName . TypeIdentifier\n\nPackageOrTypeName:\n    Identifier\n    PackageOrTypeName . Identifier\n
Run Code Online (Sandbox Code Playgroud)\n

这显然导致了一系列点分隔的标识符,没有任何类型参数。始终如一地javac拒绝像permits ChildA<?>, ChildB<?>.

\n

换句话说,Eclipse 不应在此处生成警告,更重要的是,不应在permit子句中接受参数化类型。最好的选择是等待 Eclipse\xe2\x80\x99s Java\xc2\xa017 支持的修复。@SuppressWarnings("rawtypes")您可以向整个类添加 aParent以使警告消失,但由于这会影响整个类,因此我不建议这样做。

\n