Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的可选参数化和泛型_Java_Generics - Fatal编程技术网

Java中的可选参数化和泛型

Java中的可选参数化和泛型,java,generics,Java,Generics,参数化类时是否可以指定默认类型? 例如: //抽象类 公共抽象类{ //代码 } //参数化实现类 公共类RealClass扩展了AbsClass{ //代码 } //非参数化实现类 公共类RealClass扩展了AbsClass{ //代码 } 在我的实现中,我必须指定一个或所有参数。可以将第二个参数设置为非强制性,如下所示: // abstract class public abstract class AbsClass<T1 extends Par1Class, T2 ex

参数化类时是否可以指定默认类型? 例如:

//抽象类
公共抽象类{
//代码
}
//参数化实现类
公共类RealClass扩展了AbsClass{
//代码
}
//非参数化实现类
公共类RealClass扩展了AbsClass{
//代码
}
在我的实现中,我必须指定一个或所有参数。可以将第二个参数设置为非强制性,如下所示:

// 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
}
//抽象类
公共抽象类{
//代码
}
//仅参数化了必需的IMemmentation类
公共类RealClass扩展了AbsClass{
//代码
}

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

做这件事从来没有真正好的理由。通常指定泛型类型参数,因为某些方法参数接受或返回该类型的参数。如果unspecified是有效的,那么这似乎表明您不打算执行这些方法的任何有意义的实现


无论如何,要解决您感觉到的问题,只需为您不想指定的任何类型参数指定“Object”。或者使用只有一个类型参数的另一个抽象类来扩展抽象类(在extends调用中将Object指定为第二个类型参数)。

那么,对于您的情况,正确的解决方案可能是

// parametrized only mandatory imlementation class
public class RealClass<StillGeneric extends Par1Class>
extends AbsClass<ClassThatExtendsPar1, StillGeneric> {
    // code
}
//仅参数化了必需的IMemmentation类
公共类RealClass
扩展AbsClass{
//代码
}

但我需要Abs类中的“参数化”方法。如果我参数化RealClass,在我的例子中,它没有任何用处。还是我判断错了什么?从我的观点来看,这样做是有充分理由的。因为我的“可选参数”(T2扩展了Par2Class)是一个类,我们将其用作值对象,并在其他类的批次中进行扩展。如果我没有指定T2,我只使用ValueObject中的默认方法。如果我指定,我需要特定的方法,而不必强制转换。我想在继承顺序中引入另一个类,但我对可选的参数化很好奇。谢谢。我可能错了,但我认为有这样的用例。在C++中,允许使用Dabut模板类型,例如,它们用于提供STL类型的内存分配器的默认版本。如果它与结果参数相同,那么这样做的一个很好的理由是,当您不需要将其作为基本实现的子类时,跟踪内部实体的类将默认处理最少的casted case。或者作为对现有代码(如第三方库提供的代码)进行改造的一种帮助。它只是一种帮助,可以节省代码的视觉复杂性。结果是一样的。
// parametrized only mandatory imlementation class
public class RealClass<StillGeneric extends Par1Class>
extends AbsClass<ClassThatExtendsPar1, StillGeneric> {
    // code
}