消除java泛型的类型参数

kan*_*kan 11 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";
    }
}
Run Code Online (Sandbox Code Playgroud)

我的班级使用:

class Result<P extends Property<X>, X>
{
    P p;
    List<X> list;
}
Run Code Online (Sandbox Code Playgroud)

如你所见它有两个类型参数PX.尽管如此,X总是可以从中推断,P但语言要求我提供两者:

Result<BooleanProperty, Boolean> res = new Result<BooleanProperty, Boolean>();
Run Code Online (Sandbox Code Playgroud)

有什么技巧可以摆脱X类型参数吗?我想要使​​用

Result<BooleanProperty> res = new Result<BooleanProperty>();
Run Code Online (Sandbox Code Playgroud)

另外,我不想丢失类型信息并将其用作:

Result<OtherStringProperty> res = new Result<OtherStringProperty>();
String spec = res.p.getSpecialValue();
String prop = res.list.get(0);
Run Code Online (Sandbox Code Playgroud)

der*_*ann 0

有一个类似的问题,您可能会发现其答案很有趣:/sf/answers/311658791/

从本质上讲,没有真正的方法可以解决包含额外泛型类型的问题,因为如果没有它,编译器就无法知道您正在使用什么类型。我猜这违背了您方法的目的,但您可以尝试Result在指定类型时进行扩展 - 如下所示:

class BoolResult extends Result<BoolProperty, Boolean> {
    // Do stuff
}
Run Code Online (Sandbox Code Playgroud)