[英]Java, Usual interfaces for Generic types - a bad design?
我有一個通常的接口(我不想通用)與泛型方法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
接口通用嗎? 我試圖避免手動搞亂對象和強制轉換,並將所有類型的不同屬性存儲在列表中。
(使用static只是為了在一個文件中編譯測試樣本 - 它不會改變任何東西)
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);
}
}
為了在不進行轉換的情況下使用接口,您需要使接口通用。
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);
}
}
基類中泛型方法的問題是有人可以用顯式類型參數調用它。 這顯然在這里毫無意義,這就是編譯器抱怨的原因。
似乎最好的解決方案是使您的基類通用。 如果要在列表中存儲不同類型的屬性,則會出現其他問題; 你將如何回到原始類型(無論你是否使用泛型)?
您可以使Attribute
接口通用,然后使用通配符允許任何類型的Attribute
放在List
:
List<Attribute<?>> list = new ArrayList<Attribute<?>>();
如果您需要確保每個類型只能放置一個Attribute
,只需使用Set
:
Set<Attribute<?>> set = new HashSet<Attribute<?>>();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.