在java中,如何在多级继承的情况下使用泛型返回类型重写方法
我有一个抽象类,其中包含一个返回泛型类型的抽象方法。 比方说在java中,如何在多级继承的情况下使用泛型返回类型重写方法,java,Java,我有一个抽象类,其中包含一个返回泛型类型的抽象方法。 比方说 抽象类AbstractSample{ //班级成员 //此方法需要重写 公共抽象SampleBuilder copyBuilder(); //其他方法 //建筑商 公共静态抽象类SampleBuilder{ //性质 私有字符串为; 公共SampleBuilder(AbstractSample对象){ this.as=object.as; } 公共B as(字符串as){ this.as=as; (B)本条; } 公共抽象T buil
抽象类AbstractSample{
//班级成员
//此方法需要重写
公共抽象SampleBuilder copyBuilder();
//其他方法
//建筑商
公共静态抽象类SampleBuilder{
//性质
私有字符串为;
公共SampleBuilder(AbstractSample对象){
this.as=object.as;
}
公共B as(字符串as){
this.as=as;
(B)本条;
}
公共抽象T build();
}
}
现在我有了一个类Sample1,它扩展了这个类并实现了copyBuilder()方法
public类Sample1扩展了AbstractSample{
//班级成员
@凌驾
public AbstractSample.SampleBuilder copyBuilder(){
返回新的Sample1.Builder(此);
}
//其他方法
//建筑商
公共静态类生成器扩展了SampleBuilder{
//实施
//包含成员和方法的
}
}
还有另一个类Sample2,它是Sample1的子类。
当我试图重写这个类中的copyBuilder()方法时,我在返回类型中遇到了问题
class Sample2 extends Sample1 {
//class members
// I am not allowed to implement this as below
@Override
public AbstractSample.SampleBuilder<Sample2,Sample2.Builder> copyBuilder() {
return new Sample2.Builder(this) ;
}
//other methods
//builder
public static class Builder extends SampleBuilder<Sample2,Builder> {
//implementation
//containing members and methods
}
}
类Sample2扩展了Sample1{
//班级成员
//我不允许按以下方式执行此操作
@凌驾
public AbstractSample.SampleBuilder copyBuilder(){
返回新的Sample2.Builder(此);
}
//其他方法
//建筑商
公共静态类生成器扩展了SampleBuilder{
//实施
//包含成员和方法的
}
}
IntelliJ说该方法与超类中的方法冲突,试图使用不兼容的返回类型
class Sample2 extends Sample1 {
//class members
// I am not allowed to implement this as below
@Override
public AbstractSample.SampleBuilder<Sample2,Sample2.Builder> copyBuilder() {
return new Sample2.Builder(this) ;
}
//other methods
//builder
public static class Builder extends SampleBuilder<Sample2,Builder> {
//implementation
//containing members and methods
}
}
有谁能建议如何在Sample2中实现copyBuilder()方法,以便它返回Sample2.Builder。这里不需要泛型。这非常有效:
abstract class AbstractSample {
public abstract SampleBuilder copyBuilder ();
public static abstract class SampleBuilder {
public abstract AbstractSample build();
}
}
public class Sample1 extends AbstractSample {
@Override
public Sample1.Builder copyBuilder() {
return new Sample1.Builder(this);
}
public static class Builder extends SampleBuilder {
public Builder() { }
public Builder(Sample1 d) { }
@Override
public Sample1 build() {
return null;
}
}
}
class Sample2 extends Sample1 {
@Override
public Sample2.Builder copyBuilder() {
return new Sample2.Builder(this) ;
}
public static class Builder extends Sample1.Builder {
public Builder(Sample2 d) { }
@Override
public Sample2 build() {
return null;
}
}
}
我不喜欢零件
B扩展SampleBuilder
。为什么引用它自己更有用
不管怎样,如果你改变,你可以让它工作
SampleBuilder copyBuilder()
到
SampleBuilder copyBuilder()
下面是一个完整的例子
public class Test {
abstract static class AbstractSample {
private String as;
//this method needs to be overriden
public abstract SampleBuilder<? extends AbstractSample, ?> copyBuilder();
public static abstract class SampleBuilder<T extends AbstractSample, B extends SampleBuilder<T, B>> {
private String as;
public SampleBuilder(AbstractSample object) {
this.as = object.as;
}
public B as(String as) {
this.as = as;
return (B) this;
}
public abstract T build();
}
}
static class Sample1 extends AbstractSample {
@Override
public SampleBuilder<? extends Sample1, ?> copyBuilder() {
return new Builder(this);
}
public static class Builder extends SampleBuilder<Sample1, Builder> {
public Builder(Sample1 sample1) {
super(sample1);
}
@Override
public Sample1 build() {
return null;
}
}
}
static class Sample2 extends Sample1 {
@Override
public SampleBuilder<? extends Sample2, ?> copyBuilder() {
return new Builder(this);
}
public static class Builder extends SampleBuilder<Sample2, Builder> {
public Builder(Sample2 sample2) {
super(sample2);
}
@Override
public Sample2 build() {
return null;
}
}
}
}
公共类测试{
抽象静态类AbstractSample{
私有字符串为;
//此方法需要重写
公共抽象SampleBuilder copyBuilder();
公共静态抽象类SampleBuilder{
私有字符串为;
公共SampleBuilder(AbstractSample对象){
this.as=object.as;
}
公共B as(字符串as){
this.as=as;
(B)本条;
}
公共抽象T build();
}
}
静态类Sample1扩展了AbstractSample{
@凌驾
公共SampleBuilder copyBuilder(){
返回新的构建器(此);
}
公共静态类生成器扩展了SampleBuilder{
公共建筑商(样本1样本1){
超级(样本1);
}
@凌驾
公共样本1构建(){
返回null;
}
}
}
静态类Sample2扩展了Sample1{
@凌驾
公共SampleBuilder copyBuilder(){
返回新的构建器(此);
}
公共静态类生成器扩展了SampleBuilder{
公共建筑商(样本2样本2){
超级(样本2);
}
@凌驾
公共样本2构建(){
返回null;
}
}
}
}
谢谢你的回答。但我这里确实需要泛型。让我给出构建器的详细实现。您可能对Java中有关泛型返回类型的问题感兴趣:这意味着当我从Sample1的对象调用copyBuilder()时,类本身就是一个子类,然后它返回Sample1.Builder,它将被类型转换为SampleBuilder……这是否意味着Sample1扩展了Sample1?@bushra将Sample1.Builder
更改为?
使copyBuilder()
方法可重写。不能重写方法并使返回类型不同或更一般。
public class Test {
abstract static class AbstractSample {
private String as;
//this method needs to be overriden
public abstract SampleBuilder<? extends AbstractSample, ?> copyBuilder();
public static abstract class SampleBuilder<T extends AbstractSample, B extends SampleBuilder<T, B>> {
private String as;
public SampleBuilder(AbstractSample object) {
this.as = object.as;
}
public B as(String as) {
this.as = as;
return (B) this;
}
public abstract T build();
}
}
static class Sample1 extends AbstractSample {
@Override
public SampleBuilder<? extends Sample1, ?> copyBuilder() {
return new Builder(this);
}
public static class Builder extends SampleBuilder<Sample1, Builder> {
public Builder(Sample1 sample1) {
super(sample1);
}
@Override
public Sample1 build() {
return null;
}
}
}
static class Sample2 extends Sample1 {
@Override
public SampleBuilder<? extends Sample2, ?> copyBuilder() {
return new Builder(this);
}
public static class Builder extends SampleBuilder<Sample2, Builder> {
public Builder(Sample2 sample2) {
super(sample2);
}
@Override
public Sample2 build() {
return null;
}
}
}
}