2017-10-26 9 views
-1

特定のクラス構造で私のジェネリック型が早すぎて消去されているようです。私ができる限り多くの蒸留問題があります。これは、すべて良いです Javaジェネリックはまだ型キャストを強制します

import java.util.ArrayList; 
import java.util.List; 

public class Baz { 
    public static void main(String[] args) { 

    Bar bar = new Bar(); 
    List<String> list = new ArrayList<>(); 
    list.add("Hello World"); 

    String s = bar.getFirst(list); 
    } 
} 

Baz.java

import java.util.List; 

public class Bar { 
    private final Foo foo; 

    public Bar() { 
    foo = new Foo(); 
    } 

    public <T> T getFirst(List<T> list) { 
    return foo.getFirst(list); 
    } 
} 

Bar.java

Foo.java

import java.util.List; 

public class Foo { 

    public <V> V getFirst(List<V> list) { 
    return (V) privateGetFirst(list); 
    } 

    private Object privateGetFirst(List list) { 
    return list.get(0); 
    } 
} 

:これらの3つのクラスを考えてみてください。しかし、私がBarpublic class Bar<V>と定義すると、突然呼び出しの戻り値をbar.getFirstにキャストすることになりました。返された型のbar.getFirst()は、Stringの代わりにObjectになります。どうして?

ここで何が起こっているのか理解してくれてありがとうございます。

アップデート:ここで

public <T> T invoke(final SerializableCallableIF<T> callable) { 
    return vm.invoke(callable); 
} 

https://github.com/apache/geode/blob/develop/geode-core/src/test/java/org/apache/geode/test/dunit/rules/MemberVM.javaあなたが実際のコードをしたい場合は 、私は、このメソッドを追加しようとしています。 SerializableCallable<String>でそのメソッドを呼び出すと、キャストする必要はありません。

+0

'Bar'で型パラメータを取るように定義したときに、型パラメータを提供することを覚えましたか? – user2357112

+3

間接的に記述して推測するのではなく、質問があるコードを投稿してください。 –

+0

@ user2357112ああ! 'Bar bar = new Bar()'を実行すると動作します。あなたはそれを説明できますか? –

答えて

-1

はこのような何かを試してみてください:

public class Bar<V> { 
    private final Foo<V> foo; 

    public Bar() { 
    foo = new Foo<>(); 
    } 

    public V getFirst(List<V> list) { 
    return foo.getFirst(list); 
    } 
} 
-1

getFirst()を呼び出すときは、型を指定しませんでした。

試してください:あなたはこのようにそれが気に入らない場合は String s = bar.getFirst<String>(list);

、クラスのジェネリック医薬品としての代わりに、方法(他の回答を参照してください)にTを宣言することを検討してください。それはあなたの使用に依存します。

+0

この場合は推測できますが、指定する必要はありません。 – Oleg

関連する問題