gpt4 book ai didi

java - 嵌套接口(interface)的 setter

转载 作者:行者123 更新时间:2023-11-29 06:13:08 25 4
gpt4 key购买 nike

我没有设法编译一组具有嵌套接口(interface)的类。

假设有两个接口(interface):

public interface IntA
{
public Map<String, ? extends IntB> getName();
public void setName(Map<String, ? extends IntB> name);
}

public interface IntB
{
long getId();
void setId(long id);
}

以及对应的两个实现类

public class ImplA implements IntA,Serializable
{
private Map<String, ImplB> name;
public Map<String, ? extends IntB> getName(){return name;}
public void setName(Map<String, ? extends IntB> name)
{this.name = (Map<String, ImplB>)name;}
}

public class ImplB implements IntB,Serializable
{
private long id;
public long getId() {return id;}
public void setId(long id) {this.id = id;}
}

如何使用 ImplA 的 setter?

public static void create(Random rnd, String code)
{
ImplB b = new ImplB();
b.setId(1);

ImplA a = new ImplA();
a.getName().put("key", b);
a.getName().put("key", (IntB)b);
}

结果:

put(java.lang.String,capture#50 of ? extends IntB) in
java.util.Map<java.lang.String,capture#50 of ? extends .IntB>
cannot be applied to (java.lang.String,ImplB)

put(java.lang.String,capture#845 of ? extends IntB) in
java.util.Map<java.lang.String,capture#845 of ? extends IntB>
cannot be applied to (java.lang.String,IntB)

谢谢

雷神

最佳答案

您的 getter 正在返回一个更通用的类型。想象一下,如果它的实际返回值是对 Map<String, SomeOtherImplB> 的引用- 你不希望能够放置 ImplB那里。

如果您希望能够将值放入 Map ,您需要准确指定值类型,或者使用“ super ”约束而不是“扩展”约束来指定。例如:

// This is fine
Map<String, ? super Apple> map = getMapFromSomewhere();
map.put("Foo", new Apple());

// This isn't - it might be a Map<String, Orange>!
Map<String, ? extends Fruit> map = getMapFromSomewhere();
map.put("Foo", new Apple());

所以这就是它目前无法正常工作的原因。至于解决这个问题的正确方法......很难确切地知道你想做什么。 也许您想将其更改为:

public interface IntA
{
public Map<String, IntB> getName();
public void setName(Map<String, IntB> name);
}

... 或者另一种方法是制作 IntA通用:

public interface IntA<T extends IntB> 
{
public Map<String, T> getName();
public void setName(Map<String, T> name);
}

所以在这种情况下,您的 ImplA类将实现 IntA<ImplB> .

关于java - 嵌套接口(interface)的 setter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6080471/

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