gpt4 book ai didi

java - 自绑定(bind)泛型中的子类化

转载 作者:太空宇宙 更新时间:2023-11-04 08:05:29 25 4
gpt4 key购买 nike

我遇到了具有自限制泛型子类型的自限制泛型类型的问题。

我正在尝试实现某种构建器模式,并且我希望我的语句或多或少类似于主方法中的语句。

任何人都可以帮我找到更好的声明泛型的原因,这样我就不再需要强制转换,并且在语句中不会出现编译错误。或者谁能​​用明文解释为什么这行不通?

import java.util.Date;

public class SelfBoundingGenericTypeTest {
public static void main(String[] args) {
ConcreteType type = new ConcreteType().pageSize(1).id(12);

SubType type2 = (SubType) new SubType().id(10).pageSize(0); // Why do i need the cast?

SubType type3 = new SubType().pageSize(0).id(10); // Compile error
}
}

abstract class SuperType<E extends SuperType<E>> {
private int _pageSize = Integer.MIN_VALUE;
private int _startIndex = Integer.MIN_VALUE;

@SuppressWarnings("unchecked")
public E pageSize(int value) {
this._pageSize = value;
return (E) this;
}

@SuppressWarnings("unchecked")
public E startIndex(int value) {
this._startIndex = value;
return (E) this;
}

public int getPageSize() {
return _pageSize;
}

public int getStartIndex() {
return _startIndex;
}
}

class SubType<E extends SubType<E>> extends SuperType<E> {
private long _id = Long.MIN_VALUE;

@SuppressWarnings("unchecked")
public E id(long value) {
this._id = value;
return (E) this;
}

public long getId() {
return _id;
}
}

class ConcreteType extends SubType<ConcreteType> {
private Date _startDate;

public Date getStartDate() {
return _startDate;
}

public ConcreteType startDate(Date value) {
this._startDate = value;
return this;
}
}

最佳答案

您需要类型转换,因为 SubType是原始类型。因此,它的所有成员都是原始的,包括那些继承自 SuperType 的成员。 。 SuperType.pageSize的原始签名是它的删除SuperType pageSize(int) 。因此,“修复”是不使用原始类型。这一切都将神奇地适用于 ConcreteType .

编辑:不要使用原始类型。曾经。您应该使用您的ConcreteType ,但在使用重新声明每个方法的愚蠢、白痴、白痴“解决方案”之前,请使用 ((SubType<?>) new SubType())相反。

关于java - 自绑定(bind)泛型中的子类化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12155643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com