簡體   English   中英

消除java泛型的類型參數

[英]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;
}

如您所見,它有兩個類型參數PX 盡管如此, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM