我试图将以下C#代码和行为转换为Java,但我很难找到正确的语法或编程模式。
在C#中,我可以使用out,例如interface IProxy<out Target>
,这使我可以将IProxy<DerivedElement1>
隐式转换为IProxy<BaseElement>
,但是对于Java,我不知道是否有类似的泛型修改符。
class BaseElement {
public static readonly Property<BaseElement> P1 = new Property<BaseElement>();
}
class DerivedElement1 : BaseElement {
public static readonly Property<DerivedElement1> P2 = new Property<DerivedElement1>();
}
class DerivedElement2 : BaseElement {
public static readonly Property<DerivedElement2> P2 = new Property<DerivedElement2>();
}
class Property<Owner> {
}
interface IProxy<out Target> {
}
class Proxy<Target> : IProxy<Target> {
}
class Program {
static void doSomething<Target>(IProxy<Target> proxy, Property<Target> property) {
// ...
}
static void Main(string[] args) {
Proxy<DerivedElement1> proxy1 = new Proxy<DerivedElement1>();
doSomething(proxy1, DerivedElement1.P1);
doSomething(proxy1, DerivedElement1.P2);
// expected error
doSomething(proxy1, DerivedElement2.P2);
}
}
在编译时出现预期错误而不是运行时出现错误非常重要。
您是否知道任何适用的语法或模式,可以让我在不进行任何额外转换的情况下实现相同的行为?
希望您能指导我正确的方向,非常感谢您的帮助!
doSomething(proxy1, DerivedElement2.P2)
),我将不会得到编译时错误。 - user667967public static <Target> void doSomething(IProxy<Target> proxy, Property<Target> property) {
并像这样调用它Program.<DerivedElement1>doSomething(proxy1, DerivedElement2.P2)
并获得所需的编译时错误。 - guidodoSomething(proxy1, DerivedElement1.P1);
将不起作用。 - user667967<BaseElement>doSomething()
。 - guido