[英]Eliminate type parameter of java generics
代碼:
interface Property<T>
{
T get();
}
class BoolProperty implements Property<Boolean>
{
@Override
public Boolean get()
{
return false;
}
}
class StringProperty implements Property<String>
{
@Override
public String get()
{
return "hello";
}
}
class OtherStringProperty implements Property<String>
{
@Override
public String get()
{
return "bye";
}
public String getSpecialValue()
{
return "you are special";
}
}
我的班級使用:
class Result<P extends Property<X>, X>
{
P p;
List<X> list;
}
如您所見,它有兩個類型參數P
和X
盡管如此, X
總是可以從P
推導出來,但語言要求我同時提供:
Result<BooleanProperty, Boolean> res = new Result<BooleanProperty, Boolean>();
有什么技巧可以擺脫X
型參數嗎? 我想要使用
Result<BooleanProperty> res = new Result<BooleanProperty>();
另外,我不想丟失類型信息並將其用作:
Result<OtherStringProperty> res = new Result<OtherStringProperty>();
String spec = res.p.getSpecialValue();
String prop = res.list.get(0);
我會將Result
類更改為類似的類
class Result<X> {
Property<X> property;
List<X> list;
}
我不認為編譯器可以從Property
推斷X
,因為您的Result
類正在等待兩個泛型的兩個定義。
您無法推斷出類型,但可以添加額外的間接級別:
class BoolProperty implements Property<Boolean>
{
@Override
public Boolean get()
{
return false;
}
}
class Sub<X, P extends Property<X>> {
P p;
List<X> list;
}
class Result<X> extends Sub<X, Property<X>> {
}
Result<Boolean> res = new Result<Boolean>();
List<Boolean> list = res.list;
Boolean b = res.p.get();
List<String> res2 = res.list; // compilation error
您是否嘗試過使用通配符通用?
class Result<? extends Property<X>>
{
// stuff
}
有一個類似的問題,你可能會覺得有趣的答案: https : //stackoverflow.com/a/4452268/247763
從本質上講,沒有真正的方法可以解決,包括額外的泛型類型,因為沒有它,編譯器無法知道你正在使用什么類型。 我猜這會破壞你的方法的目的,但你可以嘗試在指定類型時擴展Result
- 這樣的事情:
class BoolResult extends Result<BoolProperty, Boolean> {
// Do stuff
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.