我有这些课程.
class RedSocket {}
class GreenSocket {}
class RedWire {}
class GreenWire {}
Run Code Online (Sandbox Code Playgroud)
我有一个使用2种泛型的类
public class Connection<W, S> {}
Run Code Online (Sandbox Code Playgroud)
其中W是线型,S是套接字类型.
我正在尝试强制执行编译时检查以确保套接字和线具有相同的颜色.
我试过这样做:
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 {}
Run Code Online (Sandbox Code Playgroud)
但这并不能确保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>();
}
}
Run Code Online (Sandbox Code Playgroud)
(Radiodef 在这里解释了为什么会发生这种情况)
如何强制执行编译时检查以确保套接字和电线具有相同的颜色?
Tag*_*eev 55
似乎参数化Socket
和Wire
颜色更好:
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> {}
Run Code Online (Sandbox Code Playgroud)
这样,您可以将以下一个通用参数引入Connection
:
public class Connection<C extends Color, M extends Wire<C>, Q extends Socket<C>> {...}
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
new Connection<Red, RedWire, RedSocket>(); // ok
new Connection<Green, GreenWire, GreenSocket>(); // ok
new Connection<Green, GreenWire, RedSocket>(); // error
Run Code Online (Sandbox Code Playgroud)
Mar*_*o13 35
作为Tagir Valeev答案的一个小变化:你可以Connection
通过使它的构造函数private
(或者包可见)来摆脱类的第三个泛型参数,并提供一个工厂方法来创建Connection
确保Color
类型相同的实例对于给定的Wire
- 和Socket
类型:
class Connection<
W extends Wire<? extends Color>,
S extends Socket<? extends Color>>
{
static <C extends Color,
W extends Wire<C>,
S extends Socket<C>> Connection<W, S> create()
{
return new Connection<W, S>();
}
// Private constructor
private Connection() {}
}
interface Color {}
interface Red extends Color {}
interface Green extends Color {}
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> {}
public class CompatibleGenericsTest
{
public static void main(String[] args)
{
Connection<RedWire, RedSocket> c0 = Connection.create(); // ok
Connection<GreenWire, GreenSocket> c1 = Connection.create(); // ok
Connection<GreenWire, RedSocket> c2 = Connection.create(); // error
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1303 次 |
最近记录: |