gpt4 book ai didi

java - 如何编写带有嵌套模板参数的类?

转载 作者:行者123 更新时间:2023-11-30 02:42:32 30 4
gpt4 key购买 nike

我想知道如何用 Java 编写一个具有嵌套模板参数的类。这个question描述嵌套的模板参数,但假设将使用通配符。我想命名所有涉及的类型,所以我不想使用通配符。请注意,我知道通配符用于协方差。只要我知道模板类型是由什么组成的,我就完全可以接受模板类型的不变性。下面是一个可以编译的代码示例,但没有提供我想要的所有信息。

public class Parent<B> {

public B b;

public Parent(B b) {
this.b = b;
}
}

public class Child<B> extends Parent<B> {

public Child(B b) {
super(b);
}
}

public class Foo<ParentType extends Parent, B> {
public ParentType parent;
public B otherItem;

public Foo(ParentType parent, B otherItem) {
this.parent = parent;
this.otherItem = otherItem;
}
}


public class Main {
public static void main(String[] args) {
Parent<String> stringParent = new Parent<>("hello");
Child<Integer> intChild = new Child<>(5);

Foo<Parent, String> foo = new Foo<>(stringParent, "bonjour");
Foo<Child, Integer> childFoo = new Foo<>(intChild, 42);

Object b = foo.parent.b;
System.out.println(b + ", " + b.getClass());
}
}

我被迫将 foo.parent.b 的类型声明为 Object,即使我知道它是 String (并且程序也知道这一点:输出是 hello, class java.lang.String)。我想将代码写得更像这样:

public class Foo<ParentType extends Parent, B> {
public ParentType<B> parent;
// ^ (5:12)
public B otherItem;

public Foo(ParentType<B> parent, B otherItem) {
// ^ same error here
this.parent = parent;
this.otherItem = otherItem;
}
}

或者类似的东西,显式强制 parent 的类型链接到 B,但 IntelliJ 提示 Type 'ParentType' 没有类型参数 编译器给出错误:

Error:(5, 12) java: unexpected type
required: class
found: type parameter ParentType

上面标记了发生错误的位置。

最佳答案

这是因为您没有指定 Parent 的类型参数这里:

Foo<Parent, String> foo = new Foo<>(stringParent, "bonjour");
Foo<Child, Integer> childFoo = new Foo<>(intChildBar, 42);

Object b = foo.parent.b;

而不是 Foo<Parent, String> ,如果指定 Parent 的类型参数,即Foo<Parent<String>, String> ,那么就可以得到正确的类型b :

Foo<Parent<String>, String> foo = new Foo<>(stringParent, "bonjour");
Foo<Child, Integer> childFoo = new Foo<>(intChildBar, 42);

String b = foo.parent.b;

关于java - 如何编写带有嵌套模板参数的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41216644/

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