gpt4 book ai didi

强制兼容通配符的 Java 泛型

转载 作者:IT老高 更新时间:2023-10-28 20:42:10 26 4
gpt4 key购买 nike

我有这些类(class)。

class RedSocket {}
class GreenSocket {}
class RedWire {}
class GreenWire {}

我有一个使用 2 个泛型类型的类

public class Connection<W, S> {}

其中 W 是 Wire 类型,S 是 Socket 类型。

我正在尝试强制执行编译时检查以确保套接字和电线具有相同的颜色。

我试过这样做:

public class Connection<W extends Wire & Color, S extends Socket & Color> {}

interface Color {}

interface Red extends Color {}
interface Green extends Color {}

interface Socket {}
interface Wire {}

class RedSocket implements Socket, Red {}
class GreenSocket implements Socket, Green {}
class RedWire implements Wire, Red {}
class GreenWire implements Wire, Green {}

但这并不能真正确保所使用的 Color 对于两种泛型类型都是相同的,但我仍然可以这样做:

public class Connection<W extends Wire & Color, S extends Socket & Color> {
public static void main(String[] args) {
new Connection<RedWire, GreenSocket>();
new Connection<GreenWire, RedSocket>();
}
}

(Radiodef here 出色地解释了为什么会发生这种情况)

如何强制编译时检查以确保 socket 和电线具有相同的颜色?

最佳答案

似乎最好用颜色参数化SocketWire:

interface Socket<C extends Color> {}
interface Wire<C extends Color> {}

class RedSocket implements Socket<Red> {}
class GreenSocket implements Socket<Green> {}
class RedWire implements Wire<Red> {}
class GreenWire implements Wire<Green> {}

这样你可以在Connection中引入一个更通用的参数:

public class Connection<C extends Color, M extends Wire<C>, Q extends Socket<C>> {...}

并像这样使用它:

new Connection<Red, RedWire, RedSocket>(); // ok
new Connection<Green, GreenWire, GreenSocket>(); // ok
new Connection<Green, GreenWire, RedSocket>(); // error

关于强制兼容通配符的 Java 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32243951/

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