java - 为什么我会在这里收到类型安全警告? (泛型)

标签 java generics

我最近想了解更多关于泛型方法的知识并创建了几个示例,但我不清楚以下类型安全性。这里有一个例子:

public class GeneralMethod
{
  public static void main( String[] args )
  {
    Repository rep = new Repository();

    Set<ConcreteObject> set = rep.getObject();
  }
}


abstract class AbstractRepository
{
  public abstract <T extends SuperObject> Set<T> getObject();
}


class Repository extends AbstractRepository
{
  @Override
  public Set<ConcreteObject> getObject() //<- Type safety!
  {
    return new HashSet<ConcreteObject>();
  }
}

abstract class SuperObject
{

}

class ConcreteObject extends SuperObject
{

}

以下类型安全出现在 Repository.class在 eclipse 中:

Type safety: The return type Set < ConcreteObject > for getObject() from the type Repository needs checked conversion to conform to Set < SuperObject > from the type AbstractRepository

为什么编译器要符合Set < SuperObject > instead of Set < T extends Superobject >

您如何告诉每个存储库实现 getObject()方法有自己的类型,只在方法签名中使用泛型? (意思是不在类签名中定义泛型)。

谢谢你 伊梅内

最佳答案

How would you tell every Repository to implement a getObject() method with its own type with only using generics in method signature? (meaning without defining the generic in class signature).

你不能。当你说“它是自己的类型”时,你指的是 Repository 子类的泛型类型——除非你正在做类似 FooRepository extends AbstractRepository<Foo> 的事情,否则它不存在。 .

在这种情况下,我会简单地使抽象类泛化:

public abstract class AbstractRepository<T extends SuperObject>
      abstract Set<T> getObjects();
}

顺便说一句,没有非抽象方法的抽象类最好设计成接口(interface)。

关于java - 为什么我会在这里收到类型安全警告? (泛型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5433122/

相关文章:

java - 为什么在泛型类(Java)的构造函数中提供类型参数是错误的?

java - 如何将 List<String> 转换为 List<Integer>?

Swift:通用幂函数作为中缀运算符

java - 来自 SuperMemo (SM-2) 的间隔重复算法

java.lang.ClassNotFoundException : org. bouncycaSTLe.jcajce.provider.asymmetric.rsa.CipherSpi$NoPadding 错误

java - 将 8 位二进制的最高有效位更改为 0,并仅获取前 7 位的十进制值

java - 有什么理由在 Java 中使用泛型?

java - Eclipse - Maven 不会自动向项目添加依赖项

java - WebLogic,选择JDK

java - 在 Scala 中使用抽象成员类实现抽象的通用 Java 类