在Java中编写泛型函数时遇到问题

时间:2011-11-08 10:48:51

标签: java generics

我正在尝试创建一个使用值的函数?对于变量类型的类型。我怎么写这个?

interface MyInterface<TYPE extends Collection> {
    TYPE getResult();
    void useResult( TYPE inResult );
}

class SomeOtherClass {
    static void moveObject( MyInterface<?> inObj ) {
        //I'm using the wrong syntax on the next line, but I'm not sure
        // what I should use here.
        <?> result =  inObj.getResult();
        inObj.useResult(result);
    }
}

5 个答案:

答案 0 :(得分:2)

<T>static之间添加void

import java.util.List;

interface MyInterface<T extends List<Integer>> {
    T getResult();

    void useResult(T inResult);
}

class SomeOtherClass {
    static <T extends List<Integer>> void moveObject(MyInterface<T> inObj) {
        T result = inObj.getResult();
        inObj.useResult(result);
    }
}

答案 1 :(得分:0)

我认为以下内容应该有效(未经测试,内存不足):

class SomeOtherClass {
    static <T extends Collection> void moveObject( MyInterface<T> inObj ) {
        T result =  inObj.getResult();
        inObj.useResult(result);
    }
}

答案 2 :(得分:0)

尝试这样......

static <T> void moveObject(MyInterface<T> inObj) {
    T result = inObj.getResult();
    ...
}

答案 3 :(得分:0)

class SomeOtherClass {
    static <T> void moveObject( MyInterface<T> inObj ) {
        T result =  inObj.getResult();
        inObj.useResult(result);
    }
}

答案 4 :(得分:0)

就像其他人所说的那样,唯一的方法是让它记住你得到的东西是放回来的正确类型是引入一个类型变量。一旦事物成为?,它就会失去?所有的感觉。 (同一问题的一个常见示例是,如果您尝试编写实用程序方法来交换List中的两个元素。)

class SomeOtherClass {
    static <T extends Collection> void moveObject( MyInterface<T> inObj ) {
        T result =  inObj.getResult();
        inObj.useResult(result);
    }
}

但是,您可能会抱怨这会强制您更改方法的签名,公开暴露不必要的实现细节,并在覆盖没有类型变量的继承方法时导致问题。因为T只在参数中使用了一次,所以可以将其更改为?。由于捕获方式的原因,您可以使用(私有)辅助方法干净地完成此操作:

class SomeOtherClass {
    static void moveObject( MyInterface<?> inObj ) {
        moveObjectHelper(inObj);
    }
    private static <T extends Collection> void moveObjectHelper( MyInterface<T> inObj ) {
        T result =  inObj.getResult();
        inObj.useResult(result);
    }
}