我发现在特定的类结构中,我的泛型类型似乎过早地被删除了。这是我尽可能多的提炼问题。请考虑以下3个类:
Foo.java
import java.util.List;
public class Foo {
public <V> V getFirst(List<V> list) {
return (V) privateGetFirst(list);
}
private Object privateGetFirst(List list) {
return list.get(0);
}
}
Bar.java
import java.util.List;
public class Bar {
private final Foo foo;
public Bar() {
foo = new Foo();
}
public <T> T getFirst(List<T> list) {
return foo.getFirst(list);
}
}
Baz.java
import java.util.ArrayList;
import java.util.List;
public class Baz {
public static void main(String[] args) {
Bar bar = new Bar();
List<String> list = new ArrayList<>();
list.add("Hello World");
String s = bar.getFirst(list);
}
}
这一切都很好。但是,如果我将Bar
定义为public class Bar<V>
我突然被迫将我的回复值转换为bar.getFirst
。返回的bar.getFirst()
类型最终为Object
而不是String
。为什么呢?
感谢您帮助理解这里发生的事情。
更新 如果你想要实际的代码,我试图添加这个方法:
public <T> T invoke(final SerializableCallableIF<T> callable) {
return vm.invoke(callable);
}
此处:https://github.com/apache/geode/blob/develop/geode-core/src/test/java/org/apache/geode/test/dunit/rules/MemberVM.java。当我使用SerializableCallable<String>
调用该方法时,我不想要投射它。
答案 0 :(得分:-1)
尝试这样的事情:
public class Bar<V> {
private final Foo<V> foo;
public Bar() {
foo = new Foo<>();
}
public V getFirst(List<V> list) {
return foo.getFirst(list);
}
}
答案 1 :(得分:-1)
调用getFirst()
时未指定类型。
尝试:
String s = bar.getFirst<String>(list);
如果您不喜欢这种方式,请考虑将T
声明为类泛型而不是方法(请参阅其他答案)。这取决于您的使用情况。