gpt4 book ai didi

java - 有什么方法可以声明内部类与外部类具有相同的泛型类型吗?

转载 作者:行者123 更新时间:2023-12-01 16:46:23 25 4
gpt4 key购买 nike

有没有办法让内部类重用外部类的泛型参数?

<小时/>

我有以下类(class)

public class TaggedUnionBuilder<L,R>{
private final Class<L> leftClass;
private final Class<R> rightClass;

public TaggedUnionBuilder( Class< L > leftClass, Class< R > rightClass ) {
this.leftClass = leftClass;
this.rightClass = rightClass;
}

TaggedUnion<L,R> left( L aLeft ){
return new TaggedUnion<>( true, aLeft );
}

TaggedUnion<L,R> right( R aRight ){
return new TaggedUnion<>( false, aRight );
}


public class TaggedUnion<L,R>{
private final boolean isLeftClass;
private final Object value;


private TaggedUnion( boolean isLeftClass, Object value ) {
this.isLeftClass = isLeftClass;
this.value = value;
}

L left(){
//vvv compiler error vvv
return leftClass.cast( value );
//^^^ compiler error ^^^
}

R right(){
//vvv compiler error vvv
return rightClass.cast( value );
//^^^ compiler error ^^^
}

boolean isLeft(){
return isLeftClass;
}

boolean isRight(){
return !isLeftClass;
}
}

}

但是,我遇到了错误:

java: incompatible types: L cannot be converted to L

java: incompatible types: R cannot be converted to R

left()right() 方法中。

似乎 TaggedUnion 中的 LR 声明遮盖了 TaggedUnionBuilder 中的声明。如果我删除 TaggedUnion 的泛型参数声明,我无法将其作为泛型类型返回。

如果我从 TaggedUnion 中删除通用参数,则会收到错误

java: type TaggedUnionBuilder.TaggedUnion does not take parameters

最佳答案

由于您有一个内部类,因此泛型类型也会“传播”到内部类中。

public class Outer<A> {

Inner in;

Outer( A a ) {
in = new Inner( a );
}

Inner get() {
return in;
}

class Inner {
A value;

Inner( A value ) {
this.value = value;
}
}

public static void main( String[] args ) {
String s = new Outer<>( "test" ).get().value;
//And to declare an variable Inner
Outer<String>.Inner i = new Outer<>( "test" ).get();
}
}

声明Outer<String>然后将给出 Outer<String>.Innervalue将是 String .

如果您声明 Inner ,需要使用完整的类名来指定泛型类型,有点冗长但是是正确的解决方案。

关于java - 有什么方法可以声明内部类与外部类具有相同的泛型类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49782750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com