是否可以只在同一个包和子包中访问一个接口?

Is it possible for an interface to be accessible only in the same package and child packages?

是否可以只在同一个包和子包中访问一个接口?

我定义了一个带有默认修饰符的接口:

package com.mycompany.myapp.dao;

import java.io.Serializable;

interface BaseDao<T, Id extends Serializable> {
    public void create(T t);    
    public T readById(Id id);   
    public void update(T t);    
    public void delete(T t);
}

现在我有一个子包,我想在其中定义一个实现 BaseDao 的 class。所以我写了这段代码:

package com.mycompany.myapp.dao.jpa;

import java.io.Serializable;

public class BaseDaoJpa<T, Id extends Serializable> implements BaseDao<T, Id> {
...
}

但是我得到这个错误:

BaseDao cannot be resolved to a type

这是 Java 对界面的限制还是我做错了?

谢谢

在Java中没有"child package"这样的东西。不要被点所迷惑。 com.mycompany.myapp.daocom.mycompany.myapp.dao.jpa 是两个独立的包,彼此没有关系。

所以回答你的问题:不,不可能让一个界面只对子包可见。您可以创建您的界面 public,但之后所有其他包都可以看到它。

查看 Java 访问修饰符https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

在table可以看到default或者没有修饰符 仅限于同一包中的相同 class 或其他 class 访问。据我了解,您希望它也对其他包可见,但对世界不可见,为此您需要使用 protected 修饰符,但这是不可能的,因为它不适用所以回到您的问题不,您不能 :- (

看起来你有 extends 需要 implements.

public class BaseDaoJpa<T, Id extends Serializable> implements BaseDao<T, Id>    
{
...
}

如果您正在寻找某种方法来隐藏和仅向 Java 应用程序的其余部分公开您想要的内容,也许您需要一个组件,那么看看 OSGi。 This question 是开始阅读(或不阅读)的良好开端。