如何避免静态通用工厂方法中的"类型不匹配"?

Mar*_*ioP 5 java generics generic-method

要么我使用谷歌太愚蠢,要么到目前为止没有其他人遇到过这个问题.

我正在尝试编译以下代码:

public interface MyClass {
  public class Util {
    private static MyClass _this;
    public static <T extends MyClass> T getInstance(Class<T> clazz) {
      if(_this == null) {
        try {
          _this = clazz.newInstance();
        } catch(Exception e) {
          e.printStackTrace();
        }
      }
      return _this;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然而,在"返回_this;"行中 我收到错误"类型不匹配:无法从MyClass转换为T"为什么会这样?T扩展了MyClass,问题出在哪里?如果我将线路改为"return(T)_this;",我只是得到关于未经检查的演员的警告,但我不喜欢警告;-)有没有办法实现我想要的没有错误或警告?

Col*_*inD 6

想象一下,你有两个实现MyClass,FooBar.作为一个类型的领域MyClass,_this可以是一个Foo或一个Bar.

现在,由于您的getInstance方法返回<T extends MyClass>,因此以下列方式调用它是合法的:

MyClass myClass = Util.getInstance(MyClass.class);
Run Code Online (Sandbox Code Playgroud)

如果它是第一次调用,MyClass则不起作用,因为它是一个接口,无法实例化newInstance().

Foo foo = Util.getInstance(Foo.class);
Bar bar = Util.getInstance(Bar.class);
Run Code Online (Sandbox Code Playgroud)

现在,如果_this是一个实例Foo并且你打电话会发生什么Util.getInstance(Bar.class)?这就是为什么你不被允许这样做的原因.