我有一个抽象超类ValueType
和两个非抽象子类IntType
和DoubleType
。如何在超类方法中定义类型,如下所示
public abstract class ValueType {
public abstract <T extends ValueType> T add(T other);
}
我允许在子类方法中编写具体类型(例如,public IntType add(IntType other)
或DoubleType add(DoubleType other)
)
public class IntType extends ValueType {
private int val;
public IntType(int val){
this.val = val;
}
public int getVal(){
return this.val;
}
@Override
public IntType add(IntType other) {
return new IntType(this.val + other.getVal());
}
public class DoubleType extends ValueType {
private double val;
public DoubleType(double val){
this.val = val;
}
public double getVal(){
return this.val;
}
@Override
public DoubleType add(DoubleType other) {
return new DoubleType(this.val + other.getVal());
}
在上面的示例中,子类方法不会覆盖超类方法。
使抽象类本身泛型,而不仅仅是它的方法。
提升泛型类型
public abstract class ValueType<T extends ValueType<T>> {
public abstract T add(T other);
}
然后,具体的子类从泛型类扩展而来,并被迫重写抽象方法(省略了私有字段、getter和setter):
public class IntType extends ValueType<IntType> {
@Override
public IntType add(IntType other) {
return new IntType(this.val + other.getVal());
}
}
public class DoubleType extends ValueType<DoubleType> {
@Override
public DoubleType add(DoubleType other) {
return new DoubleType(this.val + other.getVal());
}
}
顺便说一下,你有两个打字错误:
返回新的intType(this.valueother.getVal());
应该使用this.val
。
返回新的DoubleType(this.valueother.getVal());
也应该使用this.val
。
问题内容: 请考虑以下情况: 现在,我想定义一个扩展“动物”类的“鸟”类,以确保当鸟吃时,它只吃BirdFeed。 一种解决方案是指定一种合同,其中“ eat”的调用者必须传递适当提要的实例。 将参数的责任委托给调用者是否可以接受?如何强制调用者传递参数的特殊化?有替代设计解决方案吗? 问题答案: 您需要向该类添加类型变量: 然后,您可以将子类声明为需要特定类型的:
我有一个名为的超级类,我有3个子类,分别是,和。 在每个子类中,我都有私有参数,和。 我想在 类中创建一个名为 的方法,该方法从 中删除 1 并将 10 添加到中,以便我可以在 main 方法中调用它们时将该方法应用于所有子类。但是如何将私有参数从子类获取到超类中呢? 我不能在超类中声明它们,因为每个子类都有自己的默认启动参数,这些参数应该在游戏期间进行。
我面临泛型的问题。 下面是我使用泛型的一个类: 在这里,我们的类:使用进行参数化。 我想在我们的一种方法中指定类型,如下所示: 但是,我遇到以下编译器错误:
问题内容: 我在弄清楚以下RHS中期望使用什么类型参数时遇到问题 为什么副本不合法? 问题答案: 具体参数化类型的数组固有地被破坏。请记住,数组是协变的,数组类型检查是运行时操作。在运行时,所有泛型都已被擦除,因此Array Store检查无法从中分辨出来。 泛型的基本约定是:“我,编译器,保证如果编写的代码不生成警告,则在运行时永远不会得到类强制转换异常。” 编译器也不能向您保证,如果在数组中放
在java中,我们可以缩小返回类型和throws异常类型(甚至删除throws子句): 但是,参数类型呢(如果A采用< code>T,那么为什么B不采用< code >?超级T)如: 让我们考虑一下我认为完全符合逻辑的这段代码: 所以我要说的是,在使用的代码上下文中仍然有效。
问题内容: 鉴于: 假设我想通过反射调用方法,将ArrayList作为参数传递给: 第3行将抛出异常,因为myList的运行时类型是ArrayList,而不是List。 有没有一种很好的通用方法可以不需要A类的参数类型知识? 问题答案: 如果您知道类型为,则将其用作参数。 如果您事先不知道类型,请想象您有: 如果有任何自动方式,反射应调用哪种方法? 如果需要,可以使用或,但要视情况而定。 您可以在