3

だから私は私ができることを学びました

public <T extends SomeClass & SomeInterface<OtherClass>> doSomething(T foo);

fooJavaで、それを拡張SomeClassし、実装することを表現しますSomeInterface<OtherClass>。ここまでは順調ですね。

しかし、どのようにメンバー変数に割り当てるfooのでしょうか?もちろん、クラスはメソッドdoSomething()にアタッチされている型定義については何も知りません。doSomething()

これが必要なコンテキストはPOJOであり、そのコンストラクターはsaidで引数をとる必要があり、それは再びTsaidを返す必要がありますT

私が最も近かったのは次のとおりです。

public class ThisClass implements AnotherInterface<AnotherClass> {

    private final Object obj;

    public <U extends SomeClass & SomeInterface<AnotherClass>> ThisClass(U obj) {
        this.obj = obj;
    }

    public <U extends SomeClass & SomeInterface<AnotherClass>> U getObject() {
        return (U) obj;
    }
}

しかし、チェックされていないキャストなしでは、解決策を得るために頭を丸めることはできません。

4

2 に答える 2

1

クラスをジェネリックにすることはできません:

public class ThisClass<U extends SomeClass & SomeInterface<AnotherClass>>
                                   implements AnotherInterface<AnotherClass> {

    private final U obj;

    public ThisClass(U obj) {
        this.obj = obj;
    }

    public U getObject() {
        return obj;
    }
}

次のように使用します。

ThisClass<String> instance = new ThisClass<>("Foo");
String value = instance.getObject();
于 2013-02-26T15:14:37.447 に答える
0

残念ながら、それはできません。問題は、Javaに明確なインターセプトタイプがないことですA&B

Javaにそれがあれば、次のように書くことができます。

    Pet&Furry pet;

    void set(Pet&Furry pet){ this.pet=pet; }

    Pet&Furry get(){ return pet; }

さて、型変数は傍受境界を持つことができるA&Bので、それを利用できると思うでしょう

    Object pet;

    <U extends Pet&Furry> void set(U pet){ this.pet=pet; }

    <U extends Pet&Furry> U get(){ return (U)pet; }

しかし、それはタイプセーフではありません。検討

    x.set(dog); 
    ...
    Cat cat = x.get();

プログラマーに実際のタイプを精神的に追跡するように要求する場合、私たちはそのリスクを抱えて生きる可能性があります。

于 2013-02-26T16:50:01.543 に答える