gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:45:37 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com