Java-泛型-在泛型指定对象中强制转换泛型对象无效

时间:2018-11-23 13:41:59

标签: java generics methods generic-programming generic-method

我正在尝试解决这个看似简单的泛型转换问题:

首先,声明这个简单的通用对象:

public interface GenericObject<T> {}

第二,声明此工作接口:

public interface Generic { // I don't want to do Generic<T>

    <T> void setGenericObject(GenericObject<T> obj);

}

然后,我们实现此接口:

public class GenericImpl implements Generic {

    private GenericObject<String> genericObject; // This is needed

    @Override
    public <String> void setGenericObject(GenericObject<String> obj) {
        genericObject = obj; // eclipse give me this error :
                             // Type mismatch: cannot convert from 
                             // interfaces.GenericObject<String> to
                             // interfaces.GenericObject<java.lang.String>
    }

}

如何解决此错误?

编辑:

准确地说,我要解决此问题的唯一方法是执行以下操作:

public class GenericImpl implements Generic {

    private GenericObject<String> genericObject; 

    @SuppressWarnings("unchecked") // I don't realy like this
    @Override
    public <T> void setGenericObject(GenericObject<T> obj) {
        genericObject = (GenericObject<String>) obj;
    }

}

2 个答案:

答案 0 :(得分:1)

真正的问题是

public <String> void setGenericObject(GenericObject<String> obj)

其中String与您想要的java.lang.String没有任何关系。这里的String只是一个类型参数,其名称偶然是String

请参阅Is it possible to have an interface method defined with a generic return type and a concrete implementation define the return type?

答案 1 :(得分:0)

情况1:

如果T中未使用Generic,则只需使用通配符。

class Generic {
    List<?> list;
    void set(List<?> list) {
        this.list = list;
    }
    int size() {
        return list.size(); // doesn't care about T
    }
}

情况2:

如果T仅用作局部变量,则在方法上声明<T>

class Generic {
    <T> void swapFirstAndSecond(List<T> list) {
        T first = list.get(0), second = list.get(1);
        list.set(1, first);
        list.set(0, second);
    }
}

情况3:

如果多个字段方法使用相同的类型T,但是T的确切类型并不重要,则进行{{ 1}}在课堂上

<T>

情况4:

如果class Generic<T> { List<T> list; void set(List<T> list) { this.list = list; } T getFirst() { return list.get(0); } } 必须是特定类型,例如T,则不要声明类型参数String

<T>