4

Get私は、ジェネリックメソッドとそれを実装するジェネリッククラス を備えた通常のインターフェイス(ジェネリックにしたくない)を持っています。

@Overrideは警告を表示せず、コードは意図したとおりに機能しますが、Foo#Get()に警告があります: Type safety: The return type T for Get() from the type Test.Foo<T> needs unchecked conversion to conform to TT from the type Test.Attribute

Attributeインターフェイスも汎用にする必要がありますか?オブジェクトとキャストを手動でいじるのを避け、すべてのタイプの異なる属性をリストに保存しようとしています。

(静的を使用してテストサンプルを1つのファイルにコンパイルするだけで、何も変更されません)

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

public class Test
{
    static interface Attribute
    {
        <TT> TT Get();
    }

    static class Foo<T> implements Attribute
    {
        T val;

        public Foo(T val)
        {
            this.val = val;
        }

        @Override
        public T Get()
        {
            System.out.println("it is me");

            return val;
        }
    }


    public static void main(String[] args)
    {
        List<Attribute> list = new ArrayList<Attribute>();

        list.add(new Foo<String>("test"));

        String s = list.get(0).Get();

        System.out.println(s);
    }
}
4

3 に答える 3

1

キャストせずにインターフェイスを使用するには、インターフェイスを汎用にする必要があります。

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

public class Test
{
    static interface Attribute<E> //Added Generic Param
    {
        <E> E Get();
    }

    static class Foo<T> implements Attribute<T> //Added Generic Param
    {
        T val;

        public Foo(T val)
        {
            this.val = val;
        }

        @Override
        public T Get()
        {
            System.out.println("it is me");

            return val;
        }
    }


    public static void main(String[] args)
    {
        //Specify Type of generic
        List<Attribute<String>> list = new ArrayList<Attribute<String>>(); 

        list.add(new Foo<String>("test"));

        String s = list.get(0).Get();

        System.out.println(s);
    }
}
于 2013-03-27T09:30:32.003 に答える
1

基本クラスの汎用メソッドの問題は、誰かが明示的な型パラメーターを使用して呼び出す可能性があることです。これは明らかにここでは意味がありません。それがコンパイラが文句を言う理由です。

最善の解決策は、基本クラスを汎用にすることだと思われます。さまざまなタイプの属性をリストに格納する場合は、別の問題が発生します。(ジェネリックを使用しているかどうかに関係なく)元のタイプにどのように戻すつもりですか?

于 2013-03-27T09:31:08.043 に答える
1

Attributeインターフェイスを汎用にしてから、ワイルドカードを使用してAttribute、任意のタイプのをList:に配置できるようにすることができます。

List<Attribute<?>> list = new ArrayList<Attribute<?>>();

Attribute各タイプの1つだけをコンテナに配置できるようにする必要がある場合は、 Set:を使用してください。

Set<Attribute<?>> set = new HashSet<Attribute<?>>();
于 2013-03-27T09:40:49.790 に答える