簡體   English   中英

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

[英]Alternative to c# generic modifier “out” in Java

我正在嘗試將以下c#代碼和行為轉換為Java,但我很難找到正確的語法或編程模式。

在C#中,我可以使用像在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);
    }
}

編譯時而不是在運行時出現預期錯誤是非常重要的。

您是否知道任何適用的語法或模式可以讓我在沒有任何額外轉換的情況下實現相同的行為?

我希望你能指出我正確的方向,非常感謝你的幫助!

我發現我可以使用Proxy<? extends Target> 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);
    }
}

如果我得到你的正確,你應該看看Java中的泛型類型

示例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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM