Java,泛型类型的常用接口-一个糟糕的设计?

Java,泛型类型的常用接口-一个糟糕的设计?,java,generics,Java,Generics,我有一个带有泛型方法Get的普通接口(我不想使其成为泛型接口)和一个实现它的泛型类 @Override不会给我一个警告,代码按预期工作,但我在Foo#Get()中有一个警告: 类型安全性:类型测试中Get()的返回类型T。Foo需要未选中的转换以符合类型测试中的TT。属性 我必须使属性接口也通用吗?我试图避免手动处理对象和强制转换,并将所有类型的不同属性存储在一个列表中 (使用static仅在一个文件中编译测试样本-它不会更改任何内容) import java.util.ArrayList; 导

我有一个带有泛型方法
Get
的普通接口(我不想使其成为泛型接口)和一个实现它的泛型类

@Override不会给我一个警告,代码按预期工作,但我在Foo#Get()中有一个警告:
类型安全性:类型测试中Get()的返回类型T。Foo需要未选中的转换以符合类型测试中的TT。属性

我必须使
属性
接口也通用吗?我试图避免手动处理对象和强制转换,并将所有类型的不同属性存储在一个列表中

(使用static仅在一个文件中编译测试样本-它不会更改任何内容)

import java.util.ArrayList;
导入java.util.List;
公开课考试
{
静态接口属性
{
TT Get();
}
静态类Foo实现属性
{
T值;
公共食品(T val)
{
this.val=val;
}
@凌驾
公共部门得不到
{
System.out.println(“是我”);
返回val;
}
}
公共静态void main(字符串[]args)
{
列表=新的ArrayList();
添加(新的Foo(“测试”));
字符串s=list.get(0.get();
系统输出打印项次;
}
}

要在不强制转换的情况下使用界面,需要将界面设置为通用界面

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);
    }
}
import java.util.ArrayList;
导入java.util.List;
公开课考试
{
静态接口属性//添加了泛型参数
{
E Get();
}
静态类Foo实现属性//添加了泛型参数
{
T值;
公共食品(T val)
{
this.val=val;
}
@凌驾
公共部门得不到
{
System.out.println(“是我”);
返回val;
}
}
公共静态void main(字符串[]args)
{
//指定泛型的类型
列表=新的ArrayList();
添加(新的Foo(“测试”));
字符串s=list.get(0.get();
系统输出打印项次;
}
}

基类中泛型方法的问题是,有人可以使用显式类型参数调用它。这显然在这里毫无意义,这就是编译器抱怨的原因


似乎最好的解决方案是使基类泛型化。如果要在列表中存储不同类型的属性,则会遇到不同的问题;如何返回到原始类型(无论是否使用泛型)?

您可以将
属性
界面设置为泛型,然后使用允许将任何类型的
属性
放置在
列表中:

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

它将用于一些外部抽象规则描述。我假设这个atributes的用户知道正确的类型,如果他失败了,异常就可以了
List<Attribute<?>> list = new ArrayList<Attribute<?>>();
Set<Attribute<?>> set = new HashSet<Attribute<?>>();