3

可能重复:
是否可以在 java 中引用嵌套的泛型参数?

如果可以的话,一个关于 Java 泛型的快速问题。是否有用于声明不用作实例化的泛型参数的泛型类范围类型的语法。例如:

public class <U extends FooUType> BarType<T extends FooType<U>>{

   public U getU(){return U;}
}

要创建 BarType,我想编写以下内容,它本身包含 U,但我不想单独指定 U。所以:

BarType<SomeT<FooUType>> instance

我们从参数化的 SomeT 中隐式获取 U 的类型,而无需单独指定 U。相对于:

public class BarType<U extends FooUType, T extends FooType<U>> 

这将需要:

BarType<FooUType,SomeT<FooUType>>

我想我正在寻找类似于方法中相同想法的东西:

public <U> boolean StupidMethod(String s){
    ...
}

我宁愿不使用<? extends FooUType>,因为这会导致 return 类中的方法返回类型出现问题<U extends FooUType> U

非常感谢您的澄清!

4

2 回答 2

2

正如评论所说,这是不可能的。

我宁愿不使用<? extends FooUType>,因为这会导致 return 类中的方法返回类型出现问题<U extends FooUType> U

所以,在这里你说类的一些方法返回U......但你不想 U作为类型参数。好吧,你不能同时拥有它。要么有这个:

public class BarType<T extends FooType<U>, U extends FooUType>{

   public U getU() { ... }
}

或这个:

public class BarType<T extends FooType<? extends FooUType>>{

   public FooUType getU() { ... }
}

如果只是您关心的嘈杂的实例化,您可以new BarType<>在适用的情况下使用 Java 7。如果没有 Java 7,请声明一个工厂方法,以便调用者可以使用类型推断:

public static <T extends FooType<U>, U extends FooUType> BarType<T, U> make() {
    return new BarType<T, U>();
}
于 2012-11-09T19:16:31.277 回答
2

谢谢大家,

最后我选择了不同的解决方案。基本上我试图隐藏的类U是抽象的,所以我添加U了一个通用参数,因为没有办法解决这个问题。然后我创建了扩展它的具体类,并让它们U默默地填充类型,这样调用者就不需要膨胀他们的代码。

像这样的东西:

public abstract class MyAbsClass<U extends Foo, T extends Bar<U>>{...}

public class ConcreteClass<T extends SomeBar> extends MyAbsClass<SilentUType, T>

whereSomeBar没有参数化。然后,用户可以使用以下方法进行实例化T

 new ConcreteClass<SomeDerivedBar>()

这很适合我的场景,所以我希望它可以帮助其他人。

于 2012-11-12T10:17:23.087 回答