惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
Engineering at Meta
Engineering at Meta
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
阮一峰的网络日志
阮一峰的网络日志
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
量子位
Jina AI
Jina AI
Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
L
LangChain Blog
A
About on SuperTechFans
人人都是产品经理
人人都是产品经理
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
美团技术团队
博客园 - 三生石上(FineUI控件)
N
Netflix TechBlog - Medium
D
DataBreaches.Net
P
Proofpoint News Feed
小众软件
小众软件
Vercel News
Vercel News
T
The Blog of Author Tim Ferriss
WordPress大学
WordPress大学
雷峰网
雷峰网
G
Google Developers Blog

博客园 - 方东信

【far 语言】语言文档目录 【far 语言】注解系统 【far 语言】数组 【far 语言】并发编程(协程) 【far 语言】控制流 【far 语言】异常处理 【far 语言】farcc 构建工具 【far 语言】函数 【far 语言】组合与继承 【far 语言】List 列表 【far 语言】Map 映射 【far 语言】原生内存与 FFI 【far 语言】字符串 【far 语言】语法总览 【far 语言】类型系统 Java 远程调用类,控制类的办法,老了,记不住了。靠 java opc ua 基于s7 音视频:JavaCV 采集桌面画面并显示的方法 pand3d实现服务端渲染并推流 UI弹窗遮罩屏蔽触发事件的处理 far的数据类型 Windows下Tesseract-OCR的安装与使用 LoRA配置 大模型三阶段训练方法(LLaMa Factory) windows系统下anaconda的安装和使用 trl ppo 【手把手从零实现】Qwen2.5-VL:环境配置/功能实验(图片识别理解、目标检测、文字OCR、文档解析、视频理解)/模型微调(MS-Swift 和 LLaMA-Factory) seata 1.8.0 报错大全 Springboot 报错 java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking vLLM部署多模态大模型Qwen2.5-VL-3B-Instruct
【far 语言】接口与泛型
方东信 · 2026-09-13 · via 博客园 - 方东信

本文是「far 语言」系列文档之一,总目录见《【far 语言】语言文档目录》。

接口与泛型

Far v2 类型系统:强类型 + 泛型(编译期擦除)+ 接口 + 单继承。组合与继承并存,组合仍是默认倾向。

接口

interface Runnable {
    long run(long x);
    string describe();
}
  • 显式实现:类必须用 impl 声明所实现的接口,方法签名须覆盖接口全部方法;漏写或签名不符都会编译报错。
interface IError { }

class MyError impl IError { }
  • 一个类可以实现多个接口:class MyError impl IError, ILoggable { }
  • 接口变量可接受任意实现类的实例,调用走动态分派(方法表)。
  • 接口之间也可以继承(可多继承,接口无状态): interface IChild : IParentA, IParentB { }

只能写签名

接口方法只有签名,不能写方法体(far 没有 Java 的 default method)。写了会编译报错并指向 { 的位置:

interface Greeter {
    string hello();            // ✅ 正确
    // string hi(){ ... }      // ❌ 接口方法不能有方法体(far 不支持默认方法)
}

实现类的实现必须写在类里:

interface Greeter { string hello(); }

class Dog impl Greeter {
    string hello(){ return "woof"; }   // 实现在类里
}

接口继承与满足性

被 impl 接口的父接口自动被满足 —— 与 Java 的 interface extends 语义一致:

interface Named { string name(); }
interface Aged : Named { long age(); }

class Dog impl Aged {
    string name(){ return "dog"; }
    long age(){ return 3; }
}

Named n = new Dog();     // ✅ Dog impl Aged,而 Aged : Named ⇒ Dog 天然满足 Named
Aged  a = new Dog();     // ✅
Named n2 = a;            // ✅ 接口 → 父接口,同样成立

注意实现类仍需实现继承链上的全部方法(上例 Dog 同时实现了 name()age())。

同名不同参

接口内可声明同名、参数个数不同的方法,调用按实参个数解析:

interface Greeter {
    string greet(string who);
    string greet();
}

class Dog impl Greeter {
    string greet(string who){ return "hi " + who; }
    string greet(){ return "hi"; }
}

Greeter g = new Dog();
g.greet("mike");   // hi mike
g.greet();         // hi

类继承

只允许单继承,语法用冒号;多能力请走 impl 接口列表:

class Animal {
    long hp = 100;
    string speak(){ return "animal"; }
}

class Dog : Animal impl Runnable {
    @Override
    string speak(){ return super.speak() + "+woof"; }
}
  • class 子类 : 父类 impl 接口1, 接口2 { }
  • 父类字段初始化器会自动执行;子类实例调用父类方法天经地义。
  • 子类字段不得与父类同名(编译报错)。
  • super.method() 显式调用父类实现;@Override 断言真覆盖,签名写错立刻报错。
  • 父类变量可持子类实例(向上转型),调用点按运行期类型分派。
  • 详见 inherit.md

泛型类

class Box<T> {
    T val;
    T get(){ return this.val; }
    void set(T v){ this.val = v; }
}

Box<long> b = new Box();
b.set(42);
println(b.get());        // 42
  • 编译期擦除:运行时无类型信息,Box<long>Box 生成相同代码,零开销。
  • 泛型只做编译期类型检查。

泛型约束

class NumberBox<T extends Number> {}
<T extends Runnable> void run(T r) {}
  • 泛型方法实参类型需满足 <T extends Bound> 上界,不满足编译报错。

标准库泛型容器

List<long> nums = new List();          // 见 list.md
map<string, long> m = {"alice": 30};    // 见 map.md

组合与继承

两者不是互斥替代关系,按场景选:

// ① 组合:拥有关系 / 想避免继承耦合(默认倾向)
class Animal {
    long hp;
}

class Dog {
    Animal animal = new Animal();     // 组合:拥有一个 Animal
    long hp(){ return this.animal.hp; }  // 转发
}

// ② 继承:明确的 IS-A 关系 + 需要多态分派(只允许单继承)
class Cat : Animal {
    long lives = 9;
}
  • inherit 关键字不使用;继承语法是冒号 class 子类 : 父类 { }
  • 组合耦合更松、更易替换,是默认倾向;继承用于确实存在 IS-A 与多态需求的场景。

Rust编程语言群 1036955113
java新手自学群 626070845
java/springboot/hadoop/JVM 群 4915800
Hadoop/mongodb(搭建/开发/运维)Q群481975850
GOLang Q1群:6848027
GOLang Q2群:450509103
GOLang Q3群:436173132
GOLang Q4群:141984758
GOLang Q5群:215535604
C/C++/QT群 1414577
单片机嵌入式/电子电路入门群群 306312845
MUD/LIB/交流群 391486684
Electron/koa/Nodejs/express 214737701
大前端群vue/js/ts 165150391
操作系统研发群:15375777
汇编/辅助/破解新手群:755783453
大数据 elasticsearch 群 481975850
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。