java - 一般行为

标签 java generics

(抱歉双关语)

假设有人想要定义一个通用构建器,如下所示:

public abstract class GenericBuilder<T extends Product> {
    int x;
    int y;

    <K extends GenericBuilder<T>> K setX(int x) {
        this.x = x;
        return (K)this;
    }

    <K extends GenericBuilder<T>> K  setY(int y) {
        this.y = y;
        return (K) this;
    }

    abstract T build();
}

abstract class Product {
    int x;
    int y;
}

class ConcreteProduct extends Product {
    int z;
}

class ConcreteBuilder extends GenericBuilder<ConcreteProduct>{
    int z;

    <K extends GenericBuilder<ConcreteProduct>> K  setZ(int z) {
        this.z = z;
        return (K) this;
    }

    @Override
    ConcreteProduct build() {
        ConcreteProduct cp = new ConcreteProduct();
        cp.x = x;
        cp.y = y;
        cp.z = z;
        return cp;
    }

    public static void main(String[] args) {
        new ConcreteBuilder().setX(1).setY(2).setZ(3);
    }
}

调用ConcreteBuilder.setZ()时,编译失败。

这是为什么呢?是否已到期删除?或者说,泛型不携带有关其泛型参数的信息?

编辑:

关于如何避免在以下位置使用第二个泛型参数的任何想法:

public class ConcreteBuilder extends GenericBuilder<ConcreteProduct, ConcreteBuilder>

即<...,ConcreteBuilder>,这似乎有点笨拙?我想这是不可能的。是否有其他语言(也许是 C#?)可以做到这一点?

最佳答案

以这种方式打破你的代码,你就会明白你的类 GenericBuilder<ConcreteProduct>没有定义任何 setZ() 方法。

    GenericBuilder<ConcreteProduct> setY = new ConcreteBuilder().setX(1).setY(2);
    setY.setZ(3);

关于java - 一般行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23935448/

相关文章:

java - 版本控制数据库的正确策略

c# - 我们可以有一个返回类型与输入参数类型相同的泛型函数吗?

java - 如何表达类型T必须是类型U?

C# - 当传入带参数的函数时,通用类型函数尝试将结果分配给 System.Func(指定类型)

java - Map<String,Object> 类型不适用于参数 Map<String,String[]>

c# - C# 和 Java 对象的共享业务规则

java - 无法安装 cron 作业

java - 使用 OneToOne 进行 hibernate

java - 如何发出 JMS 同步请求

java - 如何在 Java 中使用带有语言运算符和扩展 Number 的泛型类的泛型