Java泛型仍然强制类型转换

时间:2017-10-26 02:01:51

标签: java generics

我发现在特定的类结构中,我的泛型类型似乎过早地被删除了。这是我尽可能多的提炼问题。请考虑以下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>调用该方法时,我不想要投射它。

2 个答案:

答案 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声明为类泛型而不是方法(请参阅其他答案)。这取决于您的使用情况。