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接口通用吗?我试图避免手动弄乱 Object 和 casts 并将所有类型的不同属性存储在一个列表中。

(使用静态只是在一个文件中编译测试样本 - 它不会改变任何东西)

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

您可以使Attribute接口通用,然后使用通配符允许Attribute将任何类型的 s 放置在 a 中List

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

如果您需要确保Attribute容器中只能放置每种类型中的一种,只需使用Set

Set<Attribute<?>> set = new HashSet<Attribute<?>>();
于 2013-03-27T09:40:49.790 回答
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 回答