简体   繁体   English

使用泛型在Java中进行可选参数化

[英]Optional parametrization in Java with Generics

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. 在我的实现中,我必须指定NONE或ALL参数。 Is possible to make the second parameter non-mandatory, something like this: 可以使第二个参数非强制性,如下所示:

// 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
}

简单回答:不,java不支持这样的默认参数化。

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. 如果未指定有效,那似乎表明您打算不执行这些方法的任何有意义的实现。

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指定为第二个类型参数)。

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
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM