Java 中带有泛型的可选参数化
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1377622/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Optional parametrization in Java with Generics
提问by davorp
Is is it possible to specify default type when parametrzing a class? Example:
参数化类时是否可以指定默认类型?例子:
// abstract class
public abstract class AbsClass<T1 extends Par1Class, T2 extends Par2Class> {
// code
}
// parametrized imlementation class
public class RealClass extends AbsClass<ClassThatExtendsPar1, ClassThatExtendsPar2Class> {
// code
}
// non-parametrized imlementation class
public class RealClass extends AbsClass {
// code
}
in my implementation I have to specify NONE or ALL parameters. Is possible to make the second parameter non-mandatory, something like this:
在我的实现中,我必须指定 NONE 或 ALL 参数。可以将第二个参数设为非强制性,如下所示:
// abstract class
public abstract class AbsClass<T1 extends Par1Class, T2 extends Par2Class : default Par2Class > {
// code
}
// parametrized only mandatory imlementation class
public class RealClass extends AbsClass<ClassThatExtendsPar1> {
// code
}
回答by Eugen
Simple answer: no, java does not support default parametrizations like that.
简单的回答:不,java 不支持这样的默认参数化。
回答by Tim Bender
There is never really a good reason to do this. Typically you specify generic type parameters because some method arguments take or return a parameter of that type. If unspecified were valid, that would seem to suggest you intended not to perform any meaningful implementation of those methods.
从来没有真正好的理由这样做。通常您指定泛型类型参数,因为某些方法参数采用或返回该类型的参数。如果 unspecified 是有效的,这似乎表明您不打算执行这些方法的任何有意义的实现。
Anyway, to solve your perceived problem, just specify "Object" for any type parameter that you don't care to specify. Or extend the abstract class with another abstract class which has only one type parameter (specifying Object as the second type parameter in your extends call).
无论如何,要解决您感知的问题,只需为您不想指定的任何类型参数指定“对象”。或者使用另一个只有一个类型参数的抽象类扩展抽象类(在扩展调用中将 Object 指定为第二个类型参数)。
回答by Vanya
Well, the correct solution for your case may be
那么,您的情况的正确解决方案可能是
// parametrized only mandatory imlementation class
public class RealClass<StillGeneric extends Par1Class>
extends AbsClass<ClassThatExtendsPar1, StillGeneric> {
// code
}

