替代Java中的c#generic modifier“out”

时间:2015-04-09 06:35:35

标签: java c# generics

我试图将以下c#代码和行为转换为Java,但我很难找到正确的语法或编程模式。

在c#中,我可以像interface IProxy<out Target>一样使用 out ,这允许我隐式地将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);
    }
}

预期错误出现在编译时而不是运行时非常重要。

您是否知道任何适用的语法或模式可以让我在没有任何额外投射的情况下实现相同的行为?

我希望你能指出我正确的方向,非常感谢你的帮助!

2 个答案:

答案 0 :(得分:0)

我发现我可以使用Proxy<? extends Target>来声明我的代理参数。

以下是完整的解决方案:

class BaseElement {
    public static final Property<BaseElement> P1 = new Property<BaseElement>();
}
class DerivedElement1 extends BaseElement {
    public static final Property<DerivedElement1> P2 = new Property<DerivedElement1>();
}
class DerivedElement2 extends BaseElement {
    public static final Property<DerivedElement2> P2 = new Property<DerivedElement2>();
}

class Property<Owner> {
}

class Proxy<Target> {
}

class App {
    static <Target>
    void doSomething(Proxy<? extends 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);
    }
}

答案 1 :(得分:-3)

如果我说得对,你应该看看Java中的generic type

示例Java代码

public class IProxy<T>{
      ....
}

public class Property<T>{
    ....
}
public class Program {
    public static void doSomething(<IProxy<T> iProxy, Property<T> property){
       ......
    }
}

类型参数命名约定(不确定Target在C#中指的是什么)

E - Element (used extensively by the Java Collections Framework)
K - Key
N - Number
T - Type
V - Value
S,U,V etc. - 2nd, 3rd, 4th types